![]() |
TTreeView Frage
Hallo DP'ler
Ich hab ein Problem, ich hab mir ne Procedur geschrieben die einen bestimmten Pfad als TreeView angiebt. Problem daran ist, das aus dem gewählten Pfad in jedem Level nur bestimmte Ordner angezeigt bzw zum View hinzugefügt werden. Die Procedur sieht wie folgt aus:
Delphi-Quellcode:
Ziel ist jetzt das in Level 0 nur die Ordner hinzugefügt werden sollen bei dehnen SearchRec.Name[1] ein K ist und SearchRec.Name[2] eine Ziffer.
procedure TForm1.ShowDirectory(_Tree: TTreeView; _sVerzeichnis: string; _KnotenRoot: TTreeNode);
{$region 'Kommentar ShowDirectory( _Tree:TTreeView, _sVerzeichnis:string, _Eintrag:TTreeNode, )'} {* Beschreibung : Procedur baut aus einer Pfadangabe einen TreeView @param _Tree : der Tree der neu erstellt wird @param _sVerzeichnis : das QuellVerzeichnis aus dem der Tree entsteht @param _Eintrag : der erste Startknoten } {$endregion} var SearchRec : TSearchRec; KnotenNeu : TTreeNode; verz, str : string; i : integer; begin verz := _sVerzeichnis; _Tree.Items.BeginUpdate; verz := IncludeTrailingPathDelimiter(verz); if FindFirst(verz + '*.*',faDirectory, SearchRec) = 0 then begin repeat if (SearchRec.Attr and faDirectory = faDirectory) and ((SearchRec.Name[1] = 'K') or (SearchRec.Name[1] = 'M') or (SearchRec.Name[1] = 'F') or (SearchRec.Name[1] = '0')) then begin if ((SearchRec.Attr and faDirectory) <> 0) then begin _KnotenRoot := _Tree.Items.AddChild(_KnotenRoot, SearchRec.Name); KnotenNeu := _KnotenRoot.Parent; ShowDirectory(_Tree, verz + SearchRec.Name, _KnotenRoot); _KnotenRoot := KnotenNeu; end; end; until FindNext(SearchRec) <> 0 ; FindClose(SearchRec); end; _Tree.Items.EndUpdate; end; Bei Level 1 SearchRec.Name[1] ein M und SearchRec.Name[2] eine Ziffer und bei Level 2 dürfen nur noch Ordner hinzugefügt werden die mit der Ziffer [01] beginnen. Das ganze funktioniert auch halb mit den 4 Vergleichen die ich oben gemacht habe aber ich kriegs einfach ned hin den SearchRec.Name[2] mit zu überprüfen. Vielleicht weis ja jemand von euch Rat oder ne Idee wie das noch viel leichter geht mfg Ascu |
AW: TTreeView Frage
Zitat:
Delphi-Quellcode:
Und dann in deiner Procedure ShowDirectory:
function FilterDirectory(const dirname:string; level:integer):boolean;
begin result := false; if (level = 0) and (Length(dirname) >= 2) and (dirname[1]='K') and IsDigit(dirname[2]) then Result := True else if (level = 1) and ... ... end;
Delphi-Quellcode:
Dann musst du dir noch überlegen, wie du an den Level kommst.
if ((SearchRec.Attr and faDirectory) <> 0) and FilterDirectory(SearchRec.Name, level) then
begin Evtl. kann man das über _KnotenRoot.Level abgreifen oder man muss den Level schon der procedure ShowDirectory als Parameter mitgeben. |
AW: TTreeView Frage
HM wo hast du IsDigit her bzw welche Unit muss dafür eingebunden werden?
|
AW: TTreeView Frage
An sich wäre die ja selbst schnell geschrieben, oder? ;)
Aber die Funktion gibts schon in der Unit Character. |
AW: TTreeView Frage
AH ok ja hab se selbst gemacht eben :D und seh auch grad das mein Delphi mit der Unit Character ned klar kommt bzw keine findet hm...
|
AW: TTreeView Frage
Nutze gerade Delphi 2010 -- da ists jedefalls mit dabei ;) Keine Ahnung was du für eine Version nutzt, hast keine in deinem Profil angegeben.
|
AW: TTreeView Frage
hm habs jetzt so:
Delphi-Quellcode:
und so:
function TForm1.FilterDirectory(_dirname: string; _level: integer): boolean;
begin Result := false; if (_level = 0) and (Length(_dirname) >= 2) and (_dirname[1]='K') and TOlapExtraktorBase.isnumeric(_dirname[2]) then Result := true else if (_level = 1) and (Length(_dirname) >= 2) and (_dirname[1]='M') and TOlapExtraktorBase.isnumeric(_dirname[2]) then Result := true else if (_level = 2) and (Length(_dirname) >= 2) and (_dirname[1]='F') and TOlapExtraktorBase.isnumeric(_dirname[2]) then Result := true else if (_level = 3) and (Length(_dirname) >= 2) and TOlapExtraktorBase.isnumeric(_dirname[1]) and TOlapExtraktorBase.isnumeric(_dirname[2]) then Result := true else begin ShowMessage('FEHLER'); end; end;
Delphi-Quellcode:
hab zum testn mal beim level einfach 0 genommen aber er schmeist mir jetzt die ShowMessage, das heist irgendwas passt ned. Meine is numeric sieth so aus:
procedure TForm1.ShowDirectory(_Tree: TTreeView; _sVerzeichnis: string; _KnotenRoot: TTreeNode);
{$region 'Kommentar ShowDirectory( _Tree:TTreeView, _sVerzeichnis:string, _Eintrag:TTreeNode, )'} {* Beschreibung : Procedur baut aus einer Pfadangabe einen TreeView @param _Tree : der Tree der neu erstellt wird @param _sVerzeichnis : das QuellVerzeichnis aus dem der Tree entsteht @param _Eintrag : der erste Startknoten } {$endregion} var SearchRec : TSearchRec; KnotenNeu : TTreeNode; verz, str : string; i : integer; begin verz := _sVerzeichnis; _Tree.Items.BeginUpdate; verz := IncludeTrailingPathDelimiter(verz); if FindFirst(verz + '*.*',faDirectory, SearchRec) = 0 then begin repeat if (SearchRec.Attr and faDirectory = faDirectory) and FilterDirectory(SearchRec.Name, 0) then begin if ((SearchRec.Attr and faDirectory) <> 0) then begin _KnotenRoot := _Tree.Items.AddChild(_KnotenRoot, SearchRec.Name); KnotenNeu := _KnotenRoot.Parent; ShowDirectory(_Tree, verz + SearchRec.Name, _KnotenRoot); _KnotenRoot := KnotenNeu; end; end; until FindNext(SearchRec) <> 0 ; FindClose(SearchRec); end; _Tree.Items.EndUpdate; end;
Delphi-Quellcode:
Wenn ich in der Filter Funktion den Else ShowMessage Teil weglasse schmeist er mir folgenden Fehler:
class function TOlapExtraktorBase.IsNumeric(_value: string): boolean;
var i: integer; begin result := true; try i := StrToInt(_value); except result := false; end; end; Erste Gelegenheit für Exception bei $75E39617. Exception-Klasse EConvertError mit Meldung ''M' ist kein gültiger Integerwert'. Prozess OlapUI.exe (5048) Bin grad bissle überfragt was da ned passt ;( |
AW: TTreeView Frage
1.) das ShowMessage('FEHLER') gehört da nicht hin; einfach weglassen
Schliesslich gibt es die beiden Verzeichnisse "." und ".." und die sollen ausgefiltert werden. 2.) deine Funktion IsNumeric() hat den falschen Namen und passt auch Inhaltlich nicht. Digit (deutsch: Ziffer) ist das was wir prüfen wollen.
Delphi-Quellcode:
Deine function TOlapExtraktorBase.IsNumeric stiftet schon vom Namen her Verwirrung!
function CharIsDigit(const C: Char): Boolean;
begin Result := (C >= '0') and (C <='9'); end; Was hat die Prüfung eines Strings mit OLAP zu tun? Wenn es jetzt class function TStringUtils.IsNumeric heisen würde, dann wäre es akzeptabel. Aber ein ganz normale Funktion ist das was am Meisten Sinn macht. |
AW: TTreeView Frage
Jo stimmt schon bin noch relativ neu in Delphi, Konventionen vergess ich noch gern^^.
Olap kommt davon das solche Unterstützungsfunktionen in meiner Base-Unit liegen und mein Projekt ein Olap-Datenextraktor ist. Eine eigene Utils-Unit ist aber gerade im entstehen. Die ShowMessage nutze ich nur um direkt zu sehen ob der Fehler ausgelöst wird. Die kommt selbstverständlich raus. Ich weis das man das auch via exception mit try und except machen kann falls ein Fehler ausgelöst wird aber darin bin ich noch ned ganz so fit. Naja klappt soweit schon ganz gut muss mir nur noch überlegen wie ich ihm den Level übegebe, dann passts;) |
AW: TTreeView Frage
Hm wenn ich der FilterDirectory Funktion _KnotenRoot.Level übergebe schmeist er mir den Fehler:
Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 004F59E4 in Modul 'OlapUI.exe'. Lesen von Adresse 00000004'. Prozess OlapUI.exe (5428) Vielleicht hat jemand ne Idee wie ich das Level da übergeben kann, ich stell mich anscheined einfach zu blöd an... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz