![]() |
TFindComponent
Moin Moin.
Ich hänge. Folgender Code bricht bei FindComponent mit accessViolation ab.
Delphi-Quellcode:
Der folgende Code läuft anstandlos
TimeList := TStringlist.Create;
TimeList.add('EarlyGame'); TimeList.add('EarlyMidGame'); TimeList.add('MidGame'); For I := 0 to TimeList.Count-1 do begin TListView(SellProductForm.FindComponent(TimeList.Strings[I]+'View')).Items.Clear; end;
Delphi-Quellcode:
Was das denn ?
TListView(SellProductForm.FindComponent('EarlyGameView')).Items.Clear;
TListView(SellProductForm.FindComponent('EarlyMidGameView')).Items.Clear; TListView(SellProductForm.FindComponent('MidGameView')).Items.Clear; creehawk |
AW: TFindComponent
Auf den ersten Blick sieht es für mich korrekt aus.
Hast du bereits den Debugger bemüht? Teile den Schleifeninhalt gegebenenfalls auf:
Delphi-Quellcode:
Dann ist es mit dem Debugger vermutlich einfacher zu erkennen, wo der Fehler ist.
For I := 0 to TimeList.Count-1 do
begin MyString := TimeList.Strings[I]+'View'; MyComponent := SellProductForm.FindComponent(MyString); TListView(MyComponent).Items.Clear; end; |
AW: TFindComponent
Ich glaube das hier
Delphi-Quellcode:
sollte wie ein Maybe behandelt werden.
TListView(SellProductForm.FindComponent(TimeList.Strings[I]+'View'))
|
AW: TFindComponent
Delphi-Quellcode:
for I := 0 to TimeList.Count-1 do TListView(SellProductForm.FindComponent(TimeList.Strings[I]+'View')).Items.Clear;
for I := 0 to TimeList.Count-1 do TListView(SellProductForm.FindComponent(TimeList[I]+'View')).Items.Clear; // Strings ist das Default-Proeprty for S in TimeList do TListView(SellProductForm.FindComponent(S)).Items.Clear; // TStrings/TStringList besitzt einen Enumerator for var S in TimeList do TListView(SellProductForm.FindComponent(S)).Items.Clear; // Schleifenvariablen deklariere ich neuerdings direkt in der Schleife for S in TimeList do (SellProductForm.FindComponent(S) as TListView).Items.Clear; // falls es nicht sicher ist, ob es wirklich immer eine TListView ist for S in TimeList do begin Assert(Assigned(SellProductForm.FindComponent(S))); // denn was wäre, wenn du den Namen falsch geschrieben hast, bzw. es diese Komponente nicht mehr gibt (SellProductForm.FindComponent(S) as TListView).Items.Clear; end; |
AW: TFindComponent
Viele viele Maybes
|
AW: TFindComponent
Delphi-Quellcode:
Das funktioniert. Warum jetzt auch immer .....
for I in TimeList do TListView(SellProductForm.FindComponent(I)).Items.Clear;
Vielen Dank für die Hilfen! creehawk |
AW: TFindComponent
Bei den Anderen / ersten Beiden hängst du noch ein +'View' an den Namen
und hier wird der zu suchende Name direkt unverändert aus der Liste genommen. Sorry, war ein Copy&Paste-Error. Eigentlich hätte
Delphi-Quellcode:
FindComponent(TimeList[I]+'View')
zu
Delphi-Quellcode:
FindComponent(S+'View')
werden müssen und nicht zu
Delphi-Quellcode:
FindComponent(S)
Aber da du es doch direkt richtig vollständig in der Stringliste hattest, passte es zufällig. :lol: PS: Arrays haben auch einen Enumerator bekommen.
Delphi-Quellcode:
for var S in ['aaa', 'bbb'] do
ShowMessage(S); //for var S in 'aaa,bbb'.Split([',']) do var L := 'aaa,bbb'; for var S in L.Split([',']) do ShowMessage(S); |
AW: TFindComponent
Zitat:
Delphi-Quellcode:
PS: himitsu hat das in Post 4 schon geschrieben.
var
clv: TComponent; begin for s in TimeList do begin clv := SellProductForm.FindComponent(s); if clv is TListView then TListView(clv).Items.Clear; end; Bis bald... Thomas |
AW: TFindComponent
Zitat:
Ich glaube ich brauche eher ein MAP oder so
Delphi-Quellcode:
Wobei "ETo" ja quasi ein beschreibbarer Ort im Array sein muss.
// ich muss das so schreiben
For var i:Integer := 0 to parser.TokenCount-1 do arr[i] := parser.FTokens[i].Token+' '+ TokenIdToTokenString(parser.FTokens[i].TokenSQL); //so ne art mehrfach enumerate For var EFrom in parser.FTokens For var ETo in arr do ETo := EFrom.Token+' '+TokenIdToTokenString(EFrom.TokenSQL); Oder eben MAP
Delphi-Quellcode:
arr := parser.FTokens.map(Function(e:TTokenInfo):String
Begin Result := E.Token+' '+TokenIdToTokenString(E.TokenSQL) End); |
AW: TFindComponent
Rückschreibbar geht leider nicht.
z.B. über die Fields/Columns von DataSet oder Grid iterieren, da kennen die Items ihren Index, welchen man wiederum für den Zugriff auf's Array nutzen könnte. Ja, wenn mehrere Listen/Array verwendet werden oder wenn es beschreibar sein muß, da sind Enumeratoren nicht unbedingt sinnvoll. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 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-2025 by Thomas Breitkreuz