Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.30;
Скачать: CL | DM;

Вниз

неприодалимый глюк погите разобраться в VCL   Найти похожие ветки 

 
koha!   (2008-10-21 04:40) [0]

Описание глюка: Есть на форме ListView у него свойства "anhors" akLeft=true, akRight=true, akTop=true, akBottom=true; то есть компонент должен растягиваться во всю вместе с формой, но этого не происходит, то он растянется, то нет,  повисает и  при чем основательно,
http://webfile.ru/2329861 - выглядит это так, еще может вообще свернуться в комок или маленькое окошечко 100х100 пиксел где-то, по ни понятным мне причинам.  
Как этот глюк преодолеть? Писано на ВDS2006.


 
Сергей М. ©   (2008-10-21 08:40) [1]


> компонент должен растягиваться во всю вместе с формой


Что мешает указать Align = alClient вместо плясок вокруг якорей ?


 
Сергей М. ©   (2008-10-21 08:41) [2]


> компонент должен растягиваться во всю вместе с формой


Что мешает указать Align = alClient вместо плясок вокруг якорей ?


 
Ega23 ©   (2008-10-21 10:00) [3]


> о есть компонент должен растягиваться во всю вместе с формой


Вместе со своим парентом, а не с формой.


> у него свойства "anhors" akLeft=true, akRight=true, akTop=true,
>  akBottom=true;


Align:=alClient;


 
koha!   (2008-10-21 10:19) [4]


> Сергей М. ©   (21.10.08 08:41) [2]


мешает то, что listView не должен занимать всю клиентскую область формы, а должен еще оставить "кусощек" места для других VCL


 
Ega23 ©   (2008-10-21 10:23) [5]


> а должен еще оставить "кусощек" места для других VCL


Кладёшь панель с Align=alTop и ListView с Align=alClient. На панель кладёшь свои "другие VCL" (надо записать название...)


 
koha!   (2008-10-21 10:25) [6]


>"другие VCL" (надо записать название.
> ..)


- пока точно сам не знаю, что будет, все пока в разработке


 
Ega23 ©   (2008-10-21 10:49) [7]


> - пока точно сам не знаю, что будет, все пока в разработке


Я себе это твое название записал. В мемориз. Никогда ещё более дебильного определения "других контролов" не встречал.


 
Сергей М. ©   (2008-10-21 10:52) [8]


> koha!   (21.10.08 10:25) [6]


Вот как узнаешь, так сразу и приходи


 
Johnmen ©   (2008-10-21 11:05) [9]

Веселое слово "Menager" :)))


 
koha!   (2008-10-21 12:08) [10]

Сделал как предлагал > Ega23 ©   (21.10.08 10:23) [5], но результат тот же.
Так же глючит в со свойством Align = alClient.

http://webfile.ru/2330395


 
koha!   (2008-10-21 12:12) [11]


> Johnmen ©   (21.10.08 11:05) [9]
> Веселое слово "Menager" :)))


Специально так и назвал, так прикольней.


 
Ega23 ©   (2008-10-21 12:13) [12]


> Так же глючит в со свойством Align = alClient.


А якоря свои дурацкие убрал?


 
Сергей М. ©   (2008-10-21 12:17) [13]


> Johnmen ©   (21.10.08 11:05) [9]


Мда)..


> koha!   (21.10.08 12:08) [10]


Т.е. ты утверждаешь , что на форме имеенно компонент TListView  и никакой иной ?
И кроме этого контрола в кл.области окна формы нет ни единого контрола ?


 
koha!   (2008-10-21 12:18) [14]


> Ega23 ©   (21.10.08 12:13) [12]
> > Так же глючит в со свойством Align = alClient.А якоря
> свои дурацкие убрал?


да...


 
Johnmen ©   (2008-10-21 12:19) [15]


> Специально так и назвал, так прикольней.

Archve Path тоже прикольно...

> Ega23 ©   (21.10.08 12:13) [12]
> А якоря свои дурацкие убрал?

Якоря автоматом устанавливаются в Тру, когда делаем алКлиент...


 
Сергей М. ©   (2008-10-21 12:19) [16]


> Специально так и назвал


Как корабль назовешь, так он и поплывет.. Якорем .. Ко дну)...


 
koha!   (2008-10-21 12:24) [17]

Когда пустой ListView, то ничего вне подвисает нормально растягивается, но как только добавляю в него чего-нитьбудь, то подвисает, до тех пор пока скролбоксом не двинешь. затема расправляется


 
clickmaker ©   (2008-10-21 12:25) [18]

> Специально так и назвал, так прикольней.

надо было "манагер"


 
Johnmen ©   (2008-10-21 12:34) [19]


> но как только добавляю в него чего-нитьбудь

Как добавляешь?


 
koha!   (2008-10-21 12:34) [20]


> Сергей М. ©   (21.10.08 12:19) [16]

вот блин, вам и ассоциации корабли с ПО уже путают...
я конечно же пишу с ошибками, но у меня есть знакомая она профессиональный журналист газеты "N" и после как все будет готово я ее даю на проверку и  она мои ляпы все исправляет, а сейчас мне пофигу, как  написано в проекте - это не главная часть самолета, главное функционал, что бы работало правильно и без глюков.


 
Ega23 ©   (2008-10-21 12:36) [21]


> как  написано в проекте - это не главная часть самолета,
>  главное функционал, что бы работало правильно и без глюков.


Не скажи, проект с семантической модели надо начинать.


 
Сергей М. ©   (2008-10-21 13:00) [22]


> конечно же пишу с ошибками


Так в этом здесь никто и не сомневается)


> как только добавляю в него чего-нитьбудь


Комбобоксы, например ?


 
koha!   (2008-10-21 13:06) [23]


> Johnmen ©   (21.10.08 12:34) [19]
> > но как только добавляю в него чего-нитьбудьКак добавляешь?
>


 Думал, что ответить..... как то так:

unit Unit1;
//.............................................
implementation

procedure TMainFrm.Act_AddFolderExecute(Sender: TObject);
Var
 ChosenDirectory: String;
 Options: TSelectDirExtOpts;
 NewItem: TListItem;
 NameDir: String;
 i: integer;
begin
 Options:=[sdNewUI,sdShowShares];
 if Not SelectDirectory("","",ChosenDirectory, Options, Nil) then Exit;
 if ChosenDirectory = "" then Exit;
 SendDebugMsg(ChosenDirectory);
 for i:=0 to LV.Items.Count-1 do
   if CompStr(LV.Items[i].SubItems[0], ChosenDirectory) then Exit;
 if ChosenDirectory[Length(ChosenDirectory)] = "\" then NameDir:=ChosenDirectory
 else NameDir:=ExtractFileName(ChosenDirectory);
 CmBoxAddList(AddItemNew(NameDir, ChosenDirectory, SmalImgList.AddIcon(IcnFolder)),0);
end;

procedure TMainFrm.Act_AddToArchiveExecute(Sender: TObject);
var
 i: integer;
 icn: TIcon;
 Name: String;
begin
 try
   ListPathName := TStringList.Create;
   Icn := TIcon.Create;
   for i:=0 to Pred(LV.Items.Count) do ListPathName.Add(LV.Items[i].SubItems[0]);
   With FrmAddDlg do begin
     edAddFolder.Text     := "";
     edPathArchive.Text   := "";
     edPathArchive.Text   := "";
     CbBoxRepository.Text := "";
     CbBoxRepository.Items.Text := ListDir.Text;
     LBoxFiles.Clear;
     ShowModal;
   end;
 finally
   Icn.Free;
   ListPathName.Free;
 end;
end;

procedure TMainFrm.Act_Add_FilesExecute(Sender: TObject);
Var
 Icn: TIcon;
 i,c: integer;
 NewItem: TListItem;
 List: TStrings;
 HI: THandle;
 IcnIndex: Word;
begin
 OpenDlg.Options := [ofHideReadOnly,ofNoChangeDir,ofAllowMultiSelect,ofEnableSizing];
 OpenDlg.Filter  := "All files (*.*)|*.*";
 OpenDlg.InitialDir:="C:\Downloads\NEW_SOFT"; //.................
 if Not OpenDlg.Execute Then Exit;
 try
   IcnIndex := 1;
   List := TStringList.Create;
   if LV.Items.Count <> 0 then
     for i:=1 to LV.Items.Count-1 do List.Add(LV.Items[i].SubItems[0]);
   Icn:=TIcon.Create;
   LV.Items.BeginUpdate;
   for i:=0 to OpenDlg.Files.Count -1 do begin
     if List.IndexOf(OpenDlg.Files[i]) <> -1 then Continue;
     Icn.Handle:=ExtractAssociatedIcon(HInstance,PChar(OpenDlg.Files[i]),IcnIndex);
     if NOt Icn.HandleAllocated Then MainImgList.GetIcon(0,icn);
     CmBoxAddList(AddItemNew(ExtractFileName(OpenDlg.Files[i]), OpenDlg.Files[i], SmalImgList.AddIcon(Icn)),0);
   end;
   LV.Items.EndUpdate;
 finally
   Icn.Free;
   List.Free;
 end;
end;
{------------------------------ Act_LoadListExecute --------------------------}
procedure TMainFrm.Act_LoadListExecute(Sender: TObject);
var
 Fstrm : TFileStream;
 i, SizeType : integer;
 PItmCnfg : PItemConfig;
 NewItem  : TListItem;
 Icn      : TIcon;
 IcnIndex : Word;
begin
 if Not OpenDlg.Execute then Exit;
 try
   try
     Fstrm:=TFileStream.Create(OpenDlg.FileName, fmOpenRead);
     if Fstrm.Size = 0 then Exit;
     Icn := TIcon.Create;
     ClearAllList;
     SizeType:=SizeOf(TItemConfig);
     if (Fstrm.Size mod SizeType) <> 0 then begin
       ShowMessage("Error: no size type.");
       exit;
     end;
     LV.Items.BeginUpdate;
     for i:=0 to Pred((Fstrm.Size div SizeType)) do begin
       New(PItmCnfg);
       FillChar(PItmCnfg^,SizeType, 0);
       Fstrm.Read(PItmCnfg^,SizeType);
       ListConfig.Add(PItmCnfg);
       NewItem := LV.Items.Add;
       With NewItem do begin
         Caption := PItmCnfg^.Name;
         SubItems.Add(PItmCnfg^.FilePath);
         SubItems.Add(PItmCnfg^.ArchivePath);
         SubItems.Add(PwdN);
         IcnIndex := 1;
         Case TFileType(PItmCnfg^.FType) of
           FT_FOLDER: NewItem.ImageIndex:=SmalImgList.AddIcon(IcnFolder);
           FT_FILE  :
             Begin
               Icn.Handle := ExtractAssociatedIcon(HInstance,PChar(LV.Items[i].SubItems[0]),IcnIndex);
               if Not Icn.HandleAllocated Then MainImgList.GetIcon(0,Icn);
               NewItem.ImageIndex := SmalImgList.AddIcon(Icn);
             end;
         End;
       end;
       CmBoxAddList(i,Integer(TArchiveType(PItmCnfg^.ArchiveType)));
     end;
     LV.Items.EndUpdate;
   finally
     Icn.Free;
     Fstrm.Free;
   end;
 except
   Exit;
 end;
end;

function TMainFrm.AddItemNew(Name, Path: String; IcnIndex: Integer): integer;
Var
 NewItem     : TListItem;
 NewItemConf : PItemConfig;
begin
 NewItem         := LV.Items.Add;
 NewItem.Caption := Name;
 NewItem.Checked := false;
 NewItem.ImageIndex := IcnIndex;
 NewItem.SubItems.Add(Path); //File Name Full Path
 NewItem.SubItems.Add("");   //Archive Path
 NewItem.SubItems.Add(PwdN); //Password
 NewItem.SubItems.Add(IntToStr(NewItem.Index));
 Result          := NewItem.Index;
 New(NewItemConf);
 FillChar(NewItemConf^, SizeOf(TitemConfig), 0);
 NewItemConf.Name     := Name;
 NewItemConf.FilePath := Path;
 ListConfig.Add(NewItemConf);
end;

procedure TMainFrm.ClearAllList;
var
 i: integer;
begin
 if ListConfig.Count = 0 then exit;
 for i:=0 to Pred(ListConfig.Count) do Dispose(ListConfig.Items[i]);
 ListConfig.Clear;
 LV.Clear;
 SmalImgList.Clear;
end;

procedure TMainFrm.CmBoxAddList(index, ItmIndex: integer);
begin
 //R:=NewItem.DisplayRect(drBounds);
 //for c:=0 to 3 do Inc(R.Left,LV.Columns[c].Width);
 //R.Right:=R.Left+LV.Columns[3].Width;
 CmBoxList.Add(TComboBox.Create(Owner));
 With TComboBox(CmBoxList.Items[index]) do begin
     //NewItem.Data:=TComboBox.Create(Owner);
     //With TComboBox(NewItem.Data) do begin
   Parent     := LV;
   Style      := csDropDown;
   Font.Size  := 7;
   Font.Style := [fsBold];
   Font.Color := clNavy;
   Height     := 19;
   Items.Text := "RAR"+#10+"7ZIP"+#10+"ZIP";
   text       := "FREE_"+IntToStr(Index);
   OnClick    := ComboBoxOnClick;
   Tag        := index;
   ItemIndex  := ItmIndex;
   Visible    := False;
 end;
end;

procedure TMainFrm.ComboBoxOnClick(Sender: TObject);
begin
 SendDebugMsg("ComboBoxOnClick");
 With PItemConfig(ListConfig.Items[TComboBox(Sender).Tag])^ do begin
   Case TComboBox(Sender).ItemIndex of
     0: ArchiveType := AT_RAR;
     1: ArchiveType := AT_ZIP;
     3: ArchiveType := AT_7ZIP;
   end;
 end;
end;

procedure TMainFrm.FormCreate(Sender: TObject);
begin
 CurDir           := ExtractFileDir(Application.ExeName);
 CurPath          := ExtractFilePath(Application.ExeName);
 Archivator       := "Rar.exe";
 CmBoxList        := Tlist.Create;
 IcnFolder        := Ticon.Create;
 ListConfig       := TList.Create;
 ListDir          := TStringList.Create;
 IcnFolder.Handle := GetDirectoryIcon;
 if FileExists(CurPath+"DirList.lst") then ListDir.LoadFromFile(CurPath+"DirList.lst");
 if Not IcnFolder.HandleAllocated then MainImgList.GetIcon(1,IcnFolder);
 RegLoadConfiguration;
end;

end.


 
koha!   (2008-10-21 13:11) [24]


> <Цитата>
>
>
> Сергей М. ©   (21.10.08 13:00) [22]
> > конечно же пишу с ошибкамиТак в этом здесь никто и не
> сомневается)> как только добавляю в него чего-нитьбудьКомбобоксы,
>  например ?


Вот процедурки прорисовки комбо-боксов

{------------------------------- ListItemIsVisible ----------------------------}
function TMainFrm.ListItemIsVisible(LV: TListView; Index: integer): boolean;
begin
Result:=(LV.TopItem.Index <= Index) and
 (Index <= (LV.TopItem.Index + SendMessage(LV.Handle, LVM_GETCOUNTPERPAGE, 0, 0)));
end;

{----------------------------- LVCustomDraw -----------------------------------}
procedure TMainFrm.LVCustomDraw(Sender: TCustomListView; const ARect: TRect;
 var DefaultDraw: Boolean);
Var
 i,j: integer;
 SubItem: integer;
 Rect: TRect;
begin
 //ndDebugMsg("TMainFrm.LVCustomDraw ");
 if LV.Items.Count = 0 then Exit;

 for i:=0 to LV.Items.Count -1 do begin
   if ListItemIsVisible(LV, i) then begin
     //SendDebugMsg("ListItemIsVisible(LV,"+ IntToStr(i)+") = true");

     Rect    := LV.Items[i].DisplayRect(drBounds);
     SubItem := 4;
     for j:=0 to SubItem-1 do Inc(Rect.Left,LV.Columns[j].Width);
     Rect.Right:=Rect.Left+LV.Columns[SubItem].Width;

     With TComboBox(CmBoxList.Items[i]) do begin
       if ComboBoxIsDisplayChenge(CmBoxList.Items[i],Rect) then begin
         Left    := Rect.Left+5;
         Width   := (Rect.Right-Rect.Left)-10;
         Top     := Rect.Top;
       end;
     end;

     if Not TComboBox(CmBoxList.Items[i]).Visible then
       TComboBox(CmBoxList.Items[i]).Visible:=true;
   end
   else begin
     //SendDebugMsg("ListItemIsVisible(LV,"+ IntToStr(i)+") = false");
     if TComboBox(CmBoxList.Items[i]).Visible then
       TComboBox(CmBoxList.Items[i]).Visible:=false;
   end;
 end;
end;

{------------------------------ CustomDrawItem --------------------------------}
procedure TMainFrm.LVCustomDrawItem(Sender: TCustomListView; Item: TListItem;
 State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if (Item.Index mod 2) = 0 then sender.canvas.brush.Color := clInfoBk
 //Tcolor($FCCDB1)//TColor($F3DECB)//TColor($F3FFE6) //clInfoBk
 else sender.canvas.brush.Color := clCream;
 //Tcolor($AF8E50)//TColor($FCCDB1)//TColor($D1FEB4)//clInfoBk;//clwhite;
end;


 
koha!   (2008-10-21 13:18) [25]

Всем... только пожалуйста не смейтесь над кодом я не профессионал...


 
Сергей М. ©   (2008-10-21 13:25) [26]


> только пожалуйста не смейтесь


Что ж ты такой закомплексованный-то ?)

Если закомментировать тело обработчика LVCustomDraw, то якорная ситуация меняется ?


 
clickmaker ©   (2008-10-21 13:30) [27]

> [25] koha!   (21.10.08 13:18)

двигаешь комбики при каждой перерисовке?
а почему не в ответ на скролл, к примеру?
и что - они должны быть видны всегда, а не только в момент выбора?


 
Johnmen ©   (2008-10-21 13:30) [28]

Дело в том, что подтормаживаем на ожидании ответа от SendMessage(LV.Handle, LVM_GETCOUNTPERPAGE, 0, 0), когда в очереди полно других сообщений, типа WM_PAINT.
Комментарь как хочешь вызов ListItemIsVisible и смотри...


 
koha!   (2008-10-21 13:47) [29]


> Сергей М. ©   (21.10.08 13:25) [26]
> Если закомментировать тело обработчика LVCustomDraw,
>  то якорная ситуация меняется ?


якорная ситуация => исчезло


 
Сергей М. ©   (2008-10-21 13:48) [30]


> koha!


Тебя поджидает засада - с увеличением кол-ва элементов списка его перерисовка (связанная с чем угодно, в т.ч. с изменением размера кл.области контрола) будет происходить все медленнее и медленнее.


 
koha!   (2008-10-21 14:06) [31]


> Сергей М. ©   (21.10.08 13:48) [30]
> > koha!Тебя поджидает засада - с увеличением кол-ва элементов
> списка его перерисовка (связанная с чем угодно, в т.ч. с
> изменением размера кл.области контрола) будет происходить
> все медленнее и медленнее.


по этому поводу уже думал не раз, и думаю, что необходимо  сделать так, что бы перерисовывалить только те которые находятся в области видимости, а это на сколькоэкран позволяет, ну не более 40 контролов иожно определять так:  получи верхний видимый + количество видимых вот и можно в цикле перерисовать например от 31 до 57 те что видимы.


 
Сергей М. ©   (2008-10-21 14:09) [32]


> koha!   (21.10.08 14:06) [31]


Читай про св-во OwnerData пока не поздно


 
koha!   (2008-10-21 14:17) [33]


> Johnmen ©   (21.10.08 13:30) [28]
> Дело в том, что подтормаживаем на ожидании ответа от SendMessage(LV.
> Handle, LVM_GETCOUNTPERPAGE, 0, 0), когда в очереди полно
> других сообщений, типа WM_PAINT.Комментарь как хочешь вызов
> ListItemIsVisible и смотри...


SendMessage(LV.Handle, LVM_GETCOUNTPERPAGE, 0, 0) - забил ее временно, глюки не исчезают


> clickmaker ©   (21.10.08 13:30) [27]
> > [25] koha!   (21.10.08 13:18)двигаешь комбики при каждой
> перерисовке?а почему не в ответ на скролл, к примеру?и что
> - они должны быть видны всегда, а не только в момент выбора?
>


ответ на скролл, - может быть, что список не полный и скрола просто нет.
> - они должны быть видны всегда, а не только в момент выбора?
-  ну вот они видимы и как бы не тормозят, только вот это подвисание все портит.


 
clickmaker ©   (2008-10-21 14:33) [34]

> ответ на скролл, - может быть, что список не полный и скрола
> просто нет

ну так в этом случае и передвигать их не надо
по-любому, наворачивать такой зубодробительный код в событие перерисовки - не есть хорошо


 
koha!   (2008-10-21 14:39) [35]


> Сергей М. ©   (21.10.08 14:09) [32]
> > koha!   (21.10.08 14:06) [31]Читай про св-во OwnerData
> пока не поздно


Пока еще не разобрался с ownerdata но уж разбираюсь, при  том методе что ранее использоваль у меня взникал еще один глюк: в момент прорисовки любого из комбобокса вызывалась CustomDraw, который в свою очередь снова прорисовывал контрол и так возникал бесконечный цикл, который все вешал, а как это обстоят дела с ownerdata по какому событию он возникает т.е. что его вызывает?


 
Сергей М. ©   (2008-10-21 14:41) [36]


> что его вызывает?


Кого "его" ?


 
Anatoly Podgoretsky ©   (2008-10-21 15:35) [37]

> koha!  (21.10.2008 12:34:20)  [20]

Главная часть самолета парашут.


 
koha!   (2008-10-21 16:47) [38]


> Anatoly Podgoretsky ©   (21.10.08 15:35) [37]
> > koha!  (21.10.2008 12:34:20)  [20]Главная часть самолета
> парашут.


Всегда поражался, у вас ум острый как лезвие, свалили меня на повал с одной фразы.... я поднял лапки у уже сдаюсь..... :-)


 
koha!   (2008-10-21 17:05) [39]


> clickmaker ©   (21.10.08 14:33) [34]
> > ответ на скролл, - может быть, что список не полный и
> скрола > просто нетну так в этом случае и передвигать их
> не надопо-любому, наворачивать такой зубодробительный код
> в событие перерисовки - не есть хорошо


Ну если скрола нет то их все равно передвигать нуно, так как они не стоят наместе, если я фору буду растягивать и наоборот..., сами они следовать за колонками не умеют..


> Сергей М. ©   (21.10.08 14:41) [36]
> > что его вызывает?Кого "его" ?


Т.е. имел ввиду onData - событие,  в каких случаях он вызывается? так же как и CustomDraw


 
clickmaker ©   (2008-10-21 17:11) [40]

> Ну если скрола нет то их все равно передвигать нуно, так
> как они не стоят наместе, если я фору буду растягивать и
> наоборот

OnResize
HDN_TRACK



Страницы: 1 2 вся ветка

Текущий архив: 2008.11.30;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.013 c
2-1224155412
Vlad Oshin
2008-10-16 15:10
2008.11.30
нужно как можно раньше контрлам формы повесить метод


2-1224824692
Quart
2008-10-24 09:04
2008.11.30
Datafield в cxDBImage


2-1223920451
Ruzzz
2008-10-13 21:54
2008.11.30
как работать с TSplitter у которого Align := alNone ?


15-1222772538
oldman
2008-09-30 15:02
2008.11.30
Программист и ОС


15-1221642011
Дуб
2008-09-17 13:00
2008.11.30
А вот про разные мышления в решении простой задачки