Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > постоянная перерисовка


Автор: Rennigth 19.8.2004, 11:12
Всем привет.
Вобщем я создаю динамически много мелких компонентов (Панелей(скиновых) ) на 3х ScrolBoxах. И я не понимаю на двух Scrollboxах все нормально, а на третьей они при появлении постоянно перерисовываются(если их закрывает чужое окно, или просто после создании как формапоявляется) при чем перерисовываются только те которых например закрывало чужое окно. Я раньше много делал таких структур и все нормально работало. А щас я непонимаю почему. Если кому не лень посмотрите.

Это на создании формы

Код

var
 pnlData : array [0..10000] of TbsskinPanel;
 lbData  : array [0..10000] of Tlabel;
 pnlSurname, pnlDate: TbsskinPanel;
 lbSurname : TLabel;


procedure TfmJournal.CreateJournal;
var
 Index:integer;
 j,i:integer;
begin
 LockWindowUpdate(GroupBox1.Handle); // на  нем лежат скроллбоксы
//  InvalidateRect(GroupBox1.Handle,nil,false);

 Index:= 0;
 ActiveIndex := -1;

 for i:= 0 to 15 do  
 begin
   if i<>0 then begin
     pnlDate:=TbsSkinPanel.create(sbDateLessons);
     pnlDate.Parent := sbDateLessons;
     pnlDate.Height := 40;
     pnlDate.Width := 20;
     pnlDate.Top := 0;
     pnlDate.Left := i*20-20;
     pnlDate.OnClick := pnlDateClick;
     pnlDate.SkinData := fmMain.bsSkinData1;
   end;
   for j:=0 to High(StudentsList) do  // грубо говоря массив строковый
   begin
     if i=0 then begin
       pnlSurname:=TbsSkinPanel.create(sbStudentsList);
       pnlSurname.Parent := sbStudentsList;
       pnlSurname.Height := 20;
       pnlSurname.Width := 150;
       pnlSurname.Top := j*20;
       pnlSurname.Left := 0;
       pnlSurname.SkinData := fmMain.bsSkinData1;

       lbSurname:= Tlabel.Create(pnlSurname);
       lbSurname.Parent := pnlSurname;
       lbSurname.Caption := StudentsList[j].Surname + ' ' + StudentsList[j].name;
       lbSurname.Left := 3;
       lbSurname.Top:=3;
       lbSurname.Transparent :=true;

     end else begin

// вот эти панели перерисовываются

       pnlData[Index] := TbsSkinPanel.Create(sbData);
       pnlData[Index].Parent := sbData;
       pnlData[Index].Width := 20;
       pnlData[Index].Height:= 20;
       pnlData[Index].Left := i*20-20;
       pnlData[Index].Top  := j*20;
       pnlData[Index].OnClick := pnlDataClick;
       pnlData[Index].Cursor := crHandPoint;
       pnlData[Index].SkinDataName := 'whitepanelblueborder';
       pnlData[Index].SkinData := fmMain.bsSkinData1;
       pnlData[Index].Tag:= Index;

       lbData[Index]:= TLabel.Create(pnlData[Index]);
       lbData[Index].Parent := pnlData[Index];
       lbData[Index].Transparent := true;
       lbData[Index].Left := 6;
       lbData[Index].OnClick := pnlDataClick;
       lbData[Index].Top := 3;
       lbData[Index].Tag:=Index;
       lbData[Index].Transparent :=true;

       Inc(Index);
     end;
   end;
  end;
  LockWindowUpdate(0);
end;


если хоть на мысль наведете буду очень благодарен.

Автор: Viruser 20.8.2004, 21:33
Можно попробовать поставить хук на перерисовку окна(например ScrollBox'ов).
Код
PostMessage(ScrollBox1.Handle,WM_SETREDRAW,0,0);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)