Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TFindComponent (https://www.delphipraxis.net/214569-tfindcomponent.html)

creehawk 1. Feb 2024 10:30

TFindComponent
 
Moin Moin.

Ich hänge. Folgender Code bricht bei FindComponent mit accessViolation ab.
Delphi-Quellcode:
  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;
Der folgende Code läuft anstandlos

Delphi-Quellcode:
  TListView(SellProductForm.FindComponent('EarlyGameView')).Items.Clear;   
  TListView(SellProductForm.FindComponent('EarlyMidGameView')).Items.Clear;   
  TListView(SellProductForm.FindComponent('MidGameView')).Items.Clear;
Was das denn ?

creehawk

Jasocul 1. Feb 2024 10:45

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:
  For I := 0 to TimeList.Count-1 do
   begin
    MyString := TimeList.Strings[I]+'View';
    MyComponent := SellProductForm.FindComponent(MyString);
    TListView(MyComponent).Items.Clear;
   end;
Dann ist es mit dem Debugger vermutlich einfacher zu erkennen, wo der Fehler ist.

QuickAndDirty 1. Feb 2024 11:45

AW: TFindComponent
 
Ich glaube das hier
Delphi-Quellcode:
TListView(SellProductForm.FindComponent(TimeList.Strings[I]+'View'))
sollte wie ein Maybe behandelt werden.

himitsu 1. Feb 2024 11:53

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;

QuickAndDirty 1. Feb 2024 13:32

AW: TFindComponent
 
Viele viele Maybes

creehawk 1. Feb 2024 13:33

AW: TFindComponent
 
Delphi-Quellcode:
for I in TimeList do TListView(SellProductForm.FindComponent(I)).Items.Clear;
Das funktioniert. Warum jetzt auch immer .....

Vielen Dank für die Hilfen!

creehawk

himitsu 1. Feb 2024 14:53

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);

mytbo 1. Feb 2024 15:40

AW: TFindComponent
 
Zitat:

Zitat von creehawk (Beitrag 1532884)
Delphi-Quellcode:
for I in TimeList do TListView(SellProductForm.FindComponent(I)).Items.Clear;
Das funktioniert. Warum jetzt auch immer .....

Nicht sicher! FindComponent kann Nil oder etwas anderes als ein TListView liefern:
Delphi-Quellcode:
var
  clv: TComponent;
begin
  for s in TimeList do
  begin
    clv := SellProductForm.FindComponent(s);
    if clv is TListView then
      TListView(clv).Items.Clear;
  end;
PS: himitsu hat das in Post 4 schon geschrieben.

Bis bald...
Thomas

QuickAndDirty 1. Feb 2024 16:02

AW: TFindComponent
 
Zitat:

Zitat von himitsu (Beitrag 1532889)

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);

PS.
Ich glaube ich brauche eher ein MAP oder so
Delphi-Quellcode:
// 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);
Wobei "ETo" ja quasi ein beschreibbarer Ort im Array sein muss.

Oder eben MAP
Delphi-Quellcode:
arr := parser.FTokens.map(Function(e:TTokenInfo):String
                          Begin
                            Result := E.Token+'  '+TokenIdToTokenString(E.TokenSQL)
                          End);

himitsu 1. Feb 2024 16:55

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:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz