Конференция "Media" » Как скопировать один timage в другой timage [D7, WinXP]
 
  • kiligin © (11.11.09 15:05) [0]
    имеется набор timage-й типа array[1..50] of timage. возникает необходимость вставки timage в промежутки. как сделать сдвиг этих timage на единицу.
    что-то вроде
    for i:= position to countimage do
      arr[i+1]:= arr[i]
    а затем в arr[position] добавляется новый timage
  • kiligin © (11.11.09 15:30) [1]
    а если быть верным то
    for i:= countimage+1 downto position do
    arr[i] := arr[i-1];
  • iiunbreakableii (11.11.09 15:53) [2]
    а ты сделай свой массив динамическим.
    Объяви его как array of timage, затем с помощью функции setlength()
    регулируй длину своего массива.
  • kiligin © (11.11.09 16:10) [3]
    нет необходимости регулировать длину самого массива, вопрос в другом заключался.
  • iiunbreakableii (11.11.09 16:39) [4]
    А по-моему всё-таки так:

    setlength(arr,length(images)+1);
    for i:= high(arr) downto position+1 do //массив с нуля
    arr[i] := arr[i-1];
    arr[position]:=newitem;

    Если это не подходит, то опиши поподробнее, что тебе надо.
  • kiligin © (11.11.09 17:21) [5]
    я обрабатываю событие Edit1.OnKeyPress(var Key: Char)

    case key of
      'А'..'Я' :
         begin
            inc(countimage);
            arr[countimage]:= TImage.Create(nil);
            arr[countimage].Picture.LoadFromFile(<путь к файлу>+ Key+'.bmp');
            image1.Canvas.Draw(countimage * width, 0, Arr              
                                        [countimage].Picture.Bitmap.Graphic);
         end;
    end; {case}

    В общем все это отлично работает в случае, если символы добавляются в конце. А когда символы добавляются посреди строки (в любом месте), необходимо также их вставить и в массив и вывести на image1.canvas, а для этого необходимо совершить сдвиг вправо на один элемент.
    как в даном случае массив обработать? организовать цикл не проблема, проблема в переприсваивании следующему элементу массива значения предыдущего.
  • kiligin © (11.11.09 23:05) [6]
    Все проблема решена...

    for i := countimage downto pos+1+1 do begin
     Arr.symbol[i]:= Timage.Create(nil);
     Arr.symbol[i].Width:= Arr.symbol[i-1].Picture.Bitmap.Width;
     Arr.symbol[i].Canvas.Draw(0,0, Arr.symbol[i-1].Picture.Graphic);
     (*
     bitblt(Arr.symbol[i].Canvas.Handle, 0,0,
         Arr.symbol[i-1].Picture.bitmap.width, Arr.symbol[i-1].Picture.Bitmap.Height,
         Arr.symbol[i-1].Picture.Bitmap.Canvas.Handle,
         0,0, srccopy);
     *)

    end;


    в принципе без разницы что использовать: Draw или Bitblt. Рисует одинаково.

    Вопрос можно считать решенным!
  • kiligin © (11.11.09 23:07) [7]
    забыл сказать
    countimage - это количество картинок, которые уже отрисовали;
    pos - Edit1.SelStart;
 
Конференция "Media" » Как скопировать один timage в другой timage [D7, WinXP]
Есть новые Нет новых   [134430   +2][b:0][p:0.001]