Текущий архив: 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
← →
clickmaker © (2008-10-22 11:18) [41]можно ведь DBGrid взять. Там комбики без проблем можно использовать, а внешний вид вполне можно и под листвью подогнать, в т.ч. и иконки рисовать
← →
Сергей М. © (2008-10-22 19:13) [42]
> в каких случаях он вызывается? так же как и CustomDraw
Да
← →
koha! (2008-10-23 01:37) [43]
> Сергей М. © (22.10.08 19:13) [42]
> > в каких случаях он вызывается? так же как и CustomDrawДа
Чего то не заметел. создал пустую procedureTMainFrm.LVData(Sender: TObject; Item: TListItem);
begin
SendDebugMsg("LVData");
end;
Ну и ничего нет... два раза сработало и то непонятно на какие события не связанные с перерисовкой контрола.
← →
Сергей М. © (2008-10-23 08:40) [44]
> Ну и ничего нет
Читаем справку:
OnData Occurs immediately before an item is displayed in the list view control.
Set the Count when the list view"s OwnerData property is true to set the virtual number of items that the control contains
← →
Сергей М. © (2008-10-23 08:41) [45]Кр.того, см. OnDataHint
Страницы: 1 2 вся ветка
Текущий архив: 2008.11.30;
Скачать: CL | DM;
Память: 0.59 MB
Время: 0.006 c