Странное поведение TImage + TImageList

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Странное поведение TImage + TImageList

Сообщение Iv_ » 21.01.2011 11:46:01

Добрый день.
Вот такой код:
Код: Выделить всё
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.Caption='1' then ImageList1.Draw(Image3.Canvas,0,0,1,True);
  if ComboBox1.Caption='2' then ImageList1.Draw(Image3.Canvas,0,0,2,True);
  if ComboBox1.Caption='3' then ImageList1.Draw(Image3.Canvas,0,0,3,True);
  if ComboBox1.Caption='4' then ImageList1.Draw(Image3.Canvas,0,0,4,True);
  if ComboBox1.Caption='5' then ImageList1.Draw(Image3.Canvas,0,0,5,True);
end;

Происходит следующее: при первой смене значения в ComboBox1 картинка появляется в Image3 (до этого было пусто). При последующих сменах - ничего не происходит. При этом, если поменять размеры окна программы (пошире, поуже) - картинка появляется.
Если пишу так:
Код: Выделить всё
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  Form1.Image3.Canvas.Brush.Color:=clBtnFace;
  Form1.Image3.Canvas.FillRect(0,0,Width,Height);
  if ComboBox1.Caption='1' then ImageList1.Draw(Image3.Canvas,0,0,1,True);
  if ComboBox1.Caption='2' then ImageList1.Draw(Image3.Canvas,0,0,2,True);
  if ComboBox1.Caption='3' then ImageList1.Draw(Image3.Canvas,0,0,3,True);
  if ComboBox1.Caption='4' then ImageList1.Draw(Image3.Canvas,0,0,4,True);
  if ComboBox1.Caption='5' then ImageList1.Draw(Image3.Canvas,0,0,5,True);
end;

всё меняется нормально.
Вот и вопрос, чего у меня не так в первом варианте кода?

P.S. Lazarus 0.9.29 FPC 2.4.2 Ревизия SVN: 28927. Пишу под Windows Vista. В Ubuntu 10.10 компилировать еще не пробовал.

И ещё. Пробовал делать так:
Код: Выделить всё
  if ComboBox1.Caption='1' then
    begin
       ImageList1.Draw(Image3.Canvas,0,0,1,True);
       Image3.Update;
    end;

Результат работы такой же, как и при первом варианте кода.
Iv_
новенький
 
Сообщения: 36
Зарегистрирован: 08.01.2011 22:52:44

Re: Странное поведение TImage + TImageList

Сообщение Nik » 21.01.2011 13:08:00

Может попробовать очищать канву пред новой отрисовкой?

PS. Сильно подозреваю, что код

Код: Выделить всё
if ComboBox1.Caption='1'


можно заменить на более приличный

Код: Выделить всё
case ComboBox.ItemIndex of
0:
1:
2:
...
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Странное поведение TImage + TImageList

Сообщение Iv_ » 21.01.2011 13:32:07

У меня программа открывает файлы сортаментов для редактирования.
Процедуру переписал так:
Код: Выделить всё
//меняем имя редактируемого файла в зависимости от выбора в Combobox1:
procedure TForm1.ComboBox1Change(Sender: TObject);
  var List,FName: TextFile;
      SortName,SN: string;
      i,j: integer;
begin
  Form1.Image2.Canvas.Brush.Color:=clBtnFace;
  Form1.Image2.Canvas.FillRect(0,0,Width,Height);
  AssignFile(List, 'srv\List.txt');
  Reset(List);
  SN:=(ComboBox1.Text);
  i:=0;
  while SortName<>SN do
    begin
      readln(List, SortName);
      inc(i);
     end;
  CloseFile(List);
  AssignFile(FName, 'srv\FileName.txt');
  Reset(FName);
  for j:=1 to i do
    begin
      ReadLn(FName, FileName);
    end;
  CloseFile(FName);
  fdir:='srv\'+FileName;
  //выводим данные на экран:
  with Form1.Image1.Canvas do
    begin
      Brush.Color:=clBtnFace;
      FillRect(0,0,Width,Height);
      TextOut(5,5, ('Для редактирования выбран файл:  '+FileName));
      TextOut(5,20, ('Местоположение выбранного файла:  '+fdir));
    end;
  //вставляем картинку-пояснение:
  Form1.Image3.Canvas.Brush.Color:=clBtnFace;
  Form1.Image3.Canvas.FillRect(0,0,Width,Height);
  if FileName='Dvutavr.dat' then ImageList1.Draw(Image3.Canvas,0,0,1,True)
    else if FileName='Dvutavr_B.dat' then ImageList1.Draw(Image3.Canvas,0,0,2,True)
      else if FileName='Dvutavr_K.dat' then ImageList1.Draw(Image3.Canvas,0,0,4,True)
        else if FileName='Dvutavr_S.dat' then ImageList1.Draw(Image3.Canvas,0,0,3,True)
          else if FileName='Dvutavr_D.dat' then ImageList1.Draw(Image3.Canvas,0,0,2,True)
            else if FileName='Shveller.dat' then ImageList1.Draw(Image3.Canvas,0,0,5,True)
              else if FileName='Shveller_P.dat' then ImageList1.Draw(Image3.Canvas,0,0,6,True)
                else ImageList1.Draw(Image3.Canvas,0,0,0,True);
end;

Вот как раз, как во втором варианте было с перезакраской канвы Image3 в цвет формы.
В Delphi работало и по первому варианту.
Сейчас попробую без перезакраски с индексами.
Спасибо.
Правда файлы могут добавляться и в ComboBox количество Items будет изменяться... Но те, которые уже есть можно можно прописать, а остальное - на картинку по умолчанию.
Iv_
новенький
 
Сообщения: 36
Зарегистрирован: 08.01.2011 22:52:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru