Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi tstringlist probleme mit find/indexof.. (https://www.delphipraxis.net/77162-tstringlist-probleme-mit-find-indexof.html)

agm65 15. Sep 2006 13:17


tstringlist probleme mit find/indexof..
 
hallo leute, habe folgendes problem. ich habe eine stringliste mit sehr vielen einträgen, jetzt möchte ich bei einem bestimmten event aus meiner stringliste nur die werte mit dem string (pkw) bekommen und in eine combobox adden, ich dachte jetzt so:

Delphi-Quellcode:

while VehicleTypeKey.IndexOf('pkw') <> -1   do
begin
fmaddcars.cbFahrzeugart.Items.Add(VehicleTypeDe.Strings[VehicleTypeKey.IndexOf['pkw']);
end;
aber ich bekomme eine endlosschleife, hat da jemand eine lösung ? danke euch allen !

Go2EITS 15. Sep 2006 13:28

Re: tstringlist probleme mit find/indexof..
 
@agm65
Einen Fehler konnte ich schon entdecken.

Du hast geschrieben:

Wenn
VehicleTypeKey.IndexOf('pkw') nicht -1 ist dann füge ... ein.
und wieder zu WENN
D. h. sobald sich ein Eintrag in der Liste befindet, läufst Du im Kreis.

Nimm ein
Delphi-Quellcode:
IF VehicleTypeKey.IndexOf('pkw') <> -1 then
begin
fmaddcars.cbFahrzeugart.Items.Add(VehicleTypeDe.Strings[VehicleTypeKey.IndexOf['pkw']);
end;
Inwieweit weitere Fehler, insbesondere auf das Indexof['pkw']) vorhanden sind, kann ich nicht beurteilen. Ich sehe auch kein Combobox1.Add o.s.ä.

Sollte es nicht funzen, bitte mehr Code für uns.

Beste Grüße
Go2EITS

kolbaschedder 15. Sep 2006 13:33

Re: tstringlist probleme mit find/indexof..
 
indexof ist nicht geeignet um durch die Liste zu iterieren. du bekommst jedesmal den gleichen Eintrag.
Probier's mal mit :

Delphi-Quellcode:

for i:=0 to VehicleTypeKey.count-1 do
begin
  if ansipos('pkw', VehicleTypeKey[i])>=1 do
    fmaddcars.cbFahrzeugart.Items.Add(VehicleTypeKey[i]);  
end;
Der Code ist ungetestet, aber so ungefähr sollte es tun.

agm65 15. Sep 2006 13:35

Re: tstringlist probleme mit find/indexof..
 
geht leider beides nicht

kolbaschedder 15. Sep 2006 13:39

Re: tstringlist probleme mit find/indexof..
 
eine etwas genauere Fehlerbeschreibung würde helfen.

Go2EITS 15. Sep 2006 13:45

Re: tstringlist probleme mit find/indexof..
 
@agm65

Wenn wir Dir helfen sollen, zeig mal den Code in der Funktion/Procedure.
Wir lachen auch nicht! Aber wenn Du uns weder Code noch die detailierte Fehlermeldung zeigst bzw. mitteilst können wir Dir nicht weiterhelfen.

Mit der Vorschau kannst Du Deinen Beitrag sehen und solange verbessern, bis es Dir gefällt.
[Nachtrag]
527 Beiträge... na jetzt aber! [\Nachtrag]

agm65 15. Sep 2006 13:45

Re: tstringlist probleme mit find/indexof..
 
also ich erklärs euch mal, ich hab 2 stringlisten

die eine (VehicleTypeKey) enthält ,pkw ,lkw & rad
dazu gibts in der stringliste2 (VehicleTypeDe) die entsprechenden namen der fahrzeuge.

jetzt möchte ich diese namen aus stringliste2 in einer combobox anzeigen lassen. mit den indexwerten die alle einträge aus stringlist1 haben (alle pkws).

deswegen dachte ich:

Delphi-Quellcode:
// also solange ich pkw als string in der liste1 habe nimm alle werte aus stringlist2 die den gleichen index haben

while VehicleTypeKey.indexof('pkw') <> -1 do
begin
combobox.Items.Add(VehicleTypeDe.strings[VehicleTypeKey.indexof('pkw') ] );
end;

hoika 15. Sep 2006 13:49

Re: tstringlist probleme mit find/indexof..
 
Hallo,

wieso gehst du über den IndexOf ?
Ich verstehe deine Herangehensweise überhaupt nicht.

> jetzt möchte ich diese namen aus stringliste2 in einer combobox
> anzeigen lassen. mit den indexwerten die alle einträge aus stringlist1 haben (alle pkws).

Wo ist denn in stringlist2 eine Referenz auf die stringlist1 ?

Vielleicht gehst du mal von StringList weg und
baust dir eine richtige Liste auf.

Delphi-Quellcode:
type
  TVehicleTypeKey = class
    iVehicleTypeKeyId: Integer;
    sVehicleTypeKeyName: String;
  end;

type
  TVehicle = class
    iVehicleId: Integer;
    sVehicleName: String;
    VehicleType: TVehicleTypeKey
  end;

Heiko

Go2EITS 15. Sep 2006 13:50

Re: tstringlist probleme mit find/indexof..
 
Jetzt ist es schon konkreter aber ich muss passen, mangels Fachwissen. Klaus01 würde es wissen.
Aber der ist nicht online.

agm65 15. Sep 2006 13:52

Re: tstringlist probleme mit find/indexof..
 
jo schon okay, das geht leider auch nicht . damn

agm65 15. Sep 2006 14:03

Re: tstringlist probleme mit find/indexof..
 
Delphi-Quellcode:
IF VehicleTypeKey.IndexOf('pkw') <> -1 then
begin
fmaddcars.cbFahrzeugart.Items.Add(VehicleTypeDe.Strings[VehicleTypeKey.IndexOf('pkw')]);
end;
das würde gehen aber ich nur einen eintrag, klar weil ich keinen loop habe

aber wie kann ich sagen, loop mir solange wie ich den eintrag pkw habe ?

Muetze1 15. Sep 2006 16:00

Re: tstringlist probleme mit find/indexof..
 
Ist dir bewusst, dass IndexOf case-sensitiv sucht und somit keinen "Audi" in der StringListe findet, obwohl ein "audi" in dieser enthalten ist?

Go2EITS 15. Sep 2006 16:07

Re: tstringlist probleme mit find/indexof..
 
den Eintrag 'pkw' wirst Du über .find finden:

Siehe mal in die Hilfe:
Delphi-Quellcode:
Zu diesem Beispiel gehören eine Liste und eine Beschriftung (Label). Nach dem Start der Anwendung wird eine Stringliste erzeugt und mit drei Strings gefüllt. Die Methode Find durchsucht die Strings nach dem Vorkommen des Strings 'Blumen'. Wenn dieser String gefunden werden kann, wird die komplette Stringliste in das Listenfeld eingefügt, und der Indexwert von 'Blumen' erscheint als Beschriftungstext.

procedure TForm1.FormCreate(Sender: TObject);

var
  MyList: TStringList;
  Index: Integer;
begin
  MyList := TStringList.Create;
  try
    MyList.Add('Animals');
    MyList.Add('Flowers');

    MyList.Add('Cars');

    MyList.Sort;  { Find funktioniert nur für sortierte Listen! }
    if MyList.Find('Flowers', Index) then
    begin
      ListBox1.Items.AddStrings(MyList);
      Label1.Caption := 'Flowers has an index value of ' + IntToStr(Index);
    end;
  finally
    MyList.Free;
  end;
end;
Insbesondere der Abschnitt ist für Dich interessant:
Delphi-Quellcode:
    MyList.Sort;  { Find funktioniert nur für sortierte Listen! }
    if MyList.Find('Flowers', Index) then
    begin
      ListBox1.Items.AddStrings(MyList);
      Label1.Caption := 'Flowers has an index value of ' + IntToStr(Index);
    end;
Jetzt müsstet Du es aber schaffen...

generic 15. Sep 2006 16:27

Re: tstringlist probleme mit find/indexof..
 
wenn es eine stringliste ist kann man auch alternativ
die liste auf sorted stellen, dann dublicates auf delete setzen.
dann immer einträge hinzufügen. doppelte werden weggeworfen.

Delphi-Quellcode:
  sl.Sorted:=true;
  sl.Duplicates:=dupIgnore;

Der_Unwissende 15. Sep 2006 16:27

Re: tstringlist probleme mit find/indexof..
 
Hi,
warum genau scheidet denn der von Heiko gepostete Weg aus?
Ich denke der ist für dich hier immer noch der geeignetste. Zwei verschiedene Listen über den Index konsistent zu halten ist keine schöne Möglichkeit.
Um nochmal auf den Weg von Hoika zurückzukommen:
Du erstellst dir eine eigene Klasse und arbeitest mit einer TObjectList. Deine Klasse kapselt dabei alle Eigenschaften des Fahrzeugs, die TObjectList kann dann die einzelnen Instanzen speichern.

Delphi-Quellcode:
type
  TAutor = class(TObject)
    private
      FVehicleTypeDe : String;
      FVehicleTypeKey : String;
    protected
      procedure setVehicleTypeDe(const VehicleTypeDe : String);
      procedure setVehicleTypeKey(const VehicleTypeKey : String);
    public
      constructor create(const VehicleTypeDe, VehicleTypeDe : String);

      property VehicleTypeDe : String read FVehicleTypeDe write setVehicleTypeDe;
      property VehicleTypeKey : String read FVehicleTypeKey write setVehicleTypeKey;  
  end;

...

constructor TAuto.create(const VehicleTypeDe, VehicleTypeDe : String);
begin
  self.VehicleTypeDe := VehicleTypeDe;
  self.VehicleTypeKey := VehicleTypeKey;
end;

procedure TAuto.setVehicleTypeDe(const VehicleTypeDe : String);
begin
  self.FVehicleTypeDe := VehicleTypeDe;
end;

procedure TAuto.setVehicleTypeKey(const VehicleTypeKey : String);
begin
  self.FVehicleTypeKey := VehicleTypeKey;
end;
Ok, das wäre nur das Beispiel wie deine Auto Klasse aussehen könnte. Wie man eine Instanz der Klasse erzeugt denke ich ist dir klar. Alle Autos die du erzeugst speicherst du einfach in einer TObjectList. Möchtest du nun aus dieser TObjectlist alle Autos, die ein PKW sind, dann kannst du das einfach so machen:

Delphi-Quellcode:
procedure PkwsToCombobox(const ComboBox : TComboBox; const List : TObjectList);
var i : Integer;
begin
  if List.Count > 0 then
  begin
    for i := 0 to List.Count - 1 do
    begin
      if TAuto(List[i]).VehicleTypeKey = 'pkw' then
      begin
        ComboBox.Items.Add(TAuto(List[i]).VehicleTypeDe;
      end; // if TAuto(List[i]).VehicleTypeKey = 'pkw'
    end; // for i := 0 to List.Count - 1
  end; // if List.Count > 0 
end;
Schöner ist es allerdings, wenn du den TypeKey durch etwas anderes als einen String ersetzt. Du kannst z.B. einen eigenen Typen einführen:
Delphi-Quellcode:
type
  TypeKey = (tkPkw, tkLwk, tkMotorad, ...);
Dann kommt es einfach nicht mehr auf Groß- und Kleinschreibung an und du es entfällt auch der Overhead der Arbeit mit Strings.

Gruß Der Unwissende


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 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