AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TFindComponent

Ein Thema von creehawk · begonnen am 1. Feb 2024 · letzter Beitrag vom 2. Feb 2024
Antwort Antwort
Seite 1 von 2  1 2      
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
241 Beiträge
 
Delphi 10.4 Sydney
 
#1

TFindComponent

  Alt 1. Feb 2024, 11:30
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
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TFindComponent

  Alt 1. Feb 2024, 11:45
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.
Peter
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#3

AW: TFindComponent

  Alt 1. Feb 2024, 12:45
Ich glaube das hier
TListView(SellProductForm.FindComponent(TimeList.Strings[I]+'View')) sollte wie ein Maybe behandelt werden.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: TFindComponent

  Alt 1. Feb 2024, 12:53
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;
$2B or not $2B

Geändert von himitsu ( 1. Feb 2024 um 13:30 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#5

AW: TFindComponent

  Alt 1. Feb 2024, 14:32
Viele viele Maybes
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
241 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TFindComponent

  Alt 1. Feb 2024, 14:33
for I in TimeList do TListView(SellProductForm.FindComponent(I)).Items.Clear; Das funktioniert. Warum jetzt auch immer .....

Vielen Dank für die Hilfen!

creehawk
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: TFindComponent

  Alt 1. Feb 2024, 15:53
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
FindComponent(TimeList[I]+'View')
zu
FindComponent(S+'View')
werden müssen und nicht zu
FindComponent(S)

Aber da du es doch direkt richtig vollständig in der Stringliste hattest, passte es zufällig.



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);
$2B or not $2B

Geändert von himitsu ( 1. Feb 2024 um 16:14 Uhr)
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#8

AW: TFindComponent

  Alt 1. Feb 2024, 16:40
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

Geändert von mytbo ( 1. Feb 2024 um 16:53 Uhr) Grund: Bezug auf Post 4 hinzugefügt
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#9

AW: TFindComponent

  Alt 1. Feb 2024, 17:02

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);
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 1. Feb 2024 um 17:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: TFindComponent

  Alt 1. Feb 2024, 17:55
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:03 Uhr.
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