Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.11.30;
Скачать: [xml.tar.bz2];

Вниз

неприодалимый глюк погите разобраться в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.007 c
15-1222266393
oldman
2008-09-24 18:26
2008.11.30
Это новый "вирус" такой - заставка экрана?


8-1184755111
Snakecatcher
2007-07-18 14:38
2008.11.30
красивая форма


15-1222785303
Петр1(с)
2008-09-30 18:35
2008.11.30
ЖК монитор и его вред


15-1222535144
Анонимм
2008-09-27 21:05
2008.11.30
Шахматная задачка из ветки


9-1175692825
Ford
2007-04-04 17:20
2008.11.30
Электронные книги по созданию игр.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский