Autor |
Beitrag |
torstena
Hält's aus hier
Beiträge: 11
WinXP pro
Delphi 7
|
Verfasst: Sa 16.09.06 23:52
Ich habe in einem StringGrid die Eigenschaft Objects mit je einer Liste vom Typ TStringList verbunden. Das funktioniert und zeigt auch die gewünschten Ergebnisse. Eine separate Liste vom Typ TList soll jetzt auf genau diese StringListen verweisen. Gibt es eine Möglichkeit, das zu bewerkstelligen, ohne die StringListen kopieren zu müssen? (Dies würde einen hohen Verwaltungsaufwand wegen häufig nötiger Synchronisation bedeuten.) Mir schwebt da etwas in der Art einer Zeigervariable in den TList-Items vor, die ich beim Erstellen der TList-Items einfach nur auf die Objects des StringGrids verweisen lasse und dann irgendwie dereferenzieren kann. Geht das überhaupt? Wenn ja, wie?
Zur Illustration meiner Intention.
Das ist die mit den Objects[Spalte, Zeile] verbundene Datenstruktur in meinem StringGrid:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| type TWerteListe = class(TStringList) constructor Create; destructor Destroy; override; function Add(const aStr: String):Integer; override; procedure Fuellen; end; |
Das ist die Datenstruktur, die ich in meiner LZListe genannten TList verwalte:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TLZItem = class Spalte, Zeile: Byte; PWerteListe: Pointer; constructor Create(Sender: TObject; Col, Row: Byte); end; |
Deren Konstruktor sieht dann so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| constructor TLZItem.Create(Sender: TObject; Col, Row: Byte); begin inherited Create; Spalte := Col; Zeile := Row; PWerteListe := (Sender as TStringGrid).Objects[Spalte, Zeile]; end; |
Bis hierher funktioniert alles klaglos.
Meine Frage: Wie komme ich jetzt in meiner Sortierroutine SortCountWL, die ich innerhalb des Typs TLZListe definiert habe, ...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| type TLZListe = class(TList) procedure AddEintrag(Sender: TObject; Spalte, Zeile: Byte); procedure DelEintrag(Spalte, Zeile: Byte); procedure SortCountWL; end; |
... an die Eigenschaft Count der entsprechenden WerteListe?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TLZListe.SortCountWL; var Index: Integer; LZItem: TLZItem; StringList: TStringList; begin StringList := TStringList.Create; for Index := 0 to Count - 1 do begin LZItem := Items[Index]; Add(LZItem.PWerteListe^.Count);
end; StringList.Free; end; |
Wäre schön, wenn mir jemand einen Tipp geben könnte.
Gruß
Torsten
Zuletzt bearbeitet von torstena am So 17.09.06 00:25, insgesamt 2-mal bearbeitet
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 17.09.06 00:11
Titel: Re: TList verweist auf andere TList in Objects von StringGri
torstena hat folgendes geschrieben: |
Wäre schön, wenn mir jemand einen Tipp geben könnte. |
Mach ich glatt.
PWerteListe ist vom Typ Pointer, also ein untypisierter Zeiger. Delphi weiß also nicht, was das Dereferenzierte ist.
Du kannst zum Besipiel das Feld PWerteListe als TWerteListe deklarieren. Dann brauchst du nichts mehr dereferenzieren.
Delphi wird sich dann eventuell bei der Zuweisung mit dem Stringgrid.Objects[] beschweren, das liegt dann aber nur an der Typstrenge von Delphi. Hier reicht ein einfacher Typecast.
Ich hoffe mal du weißt was ich meine, wenn nicht, frag einfach nochmal.
Martok
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
torstena 
Hält's aus hier
Beiträge: 11
WinXP pro
Delphi 7
|
Verfasst: So 17.09.06 00:36
Hallo Martok!
Schön, wenn einem so schnell geholfen wird - und dann noch aus der Region! Habe das Ganze deinem Tipp entsprechend verändert, d.h.:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| type TLZItem = class Spalte, Zeile: Byte; WerteListe: TWerteListe; constructor Create(Sender: TObject; Col, Row: Byte); end; |
Jetzt beschwert sich der Compiler in meinem Konstruktor
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| constructor TLZItem.Create(Sender: TObject; Col, Row: Byte); begin inherited Create; Spalte := Col; Zeile := Row; WerteListe := (Sender as TStringGrid).Objects[Spalte, Zeile]; end; |
mit der Meldung: "Inkompatible Typen: 'TWerteListe' und 'TObject'". Dafür reicht in meinem Alter die Kraft einfach nicht mehr! HILFÄÄÄ!!!
Torsten
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 17.09.06 02:26
hallo torsana,
in deinem ersten post ist mir eines nicht ganz klar..., du hast eine tstringlist mit einem StringGrid sincronisiert und möchtest jetzt das ganze als string in einer tList haben...
tja, tStringList ist bereits eine tList. also welche sonderfunktionen würdest du dir darüber hinaus wünschen? tStringList kann die strings sortieren, tList ... tja, der musst du es erst noch beibringen.
kannst dein problem bitte näher definieren, wäre nett.
|
|
torstena 
Hält's aus hier
Beiträge: 11
WinXP pro
Delphi 7
|
Verfasst: So 17.09.06 16:07
Titel: Hallo Grenzgaenger,
nein, das hast du missverstanden. Ich habe meine WerteListe:TStringList nicht mit einem StringGrid synchronisiert, sondern mit der Objects-Eigenschaft der Zellen dieses StringGrids. Das ist ein Unterschied.
Ich möchte nun nichts weiter, als in einer separaten LZListe vom Typ TList, die Einträge des Typs TLZItem verwaltet, in jedem dieser LZItems im Feld WerteListe (Typ: TWerteListe) einen Verweis auf die in den Objects des StringGrids gespeicherten WerteListen setzen, wobei mein Konstruktor (siehe oben) besagte Fehlermeldung abwirft. Wie muss ich also die Zuweisung im Konstruktor korrekt durchführen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| type TLZItem = class Spalte, Zeile: Integer; WerteListe: TWerteListe; constructor Create(Sender: TObject; Col, Row: Integer); end;
TLZListe = class(TList) private FFound: Boolean; public procedure AddEintrag(Sender: TObject; Spalte, Zeile: Integer); procedure DelEintrag(Spalte, Zeile: Integer); procedure SortCountWL; function FindeZelle(Spalte, Zeile: Integer): Integer; property Found: Boolean read FFound write FFound; end; | und erhalte hier den Fehler: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| constructor TLZItem.Create(Sender: TObject; Col, Row: Integer); begin inherited Create; Spalte := Col; Zeile := Row; end; | (Habe die den Fehler erzeugende Zeile auskommentiert, damit ich in der Zwischenzeit schon weiterschreiben konnte.)
Nochmals die Frage: Wie bekomme ich einen syntaktisch korrekten und funktionierenden Link (- wohlgemerkt, keine Kopie) von den in den StringGrid.Objects verbandelten WerteListen auf mein Feld WerteListe in TLZItem hin?
Hat jemand den Durchblick?
Gruß
Torsten
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 17.09.06 16:18
Titel: Re: TList verweist auf andere TList in Objects von StringGri
Martok hat folgendes geschrieben: |
Delphi wird sich dann eventuell bei der Zuweisung mit dem Stringgrid.Objects[] beschweren, das liegt dann aber nur an der Typstrenge von Delphi. Hier reicht ein einfacher Typecast. |
Also würde das dann heißen:
Delphi-Quelltext 1:
| WerteListe := TWerteListe((Sender as TStringGrid).Objects[Spalte, Zeile]); |
zum Thema 'aus der Region': wusste gar nicht, dass es hier noch Leute aus Sachsen-Anhalt gibt^^
Martok
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
torstena 
Hält's aus hier
Beiträge: 11
WinXP pro
Delphi 7
|
Verfasst: So 17.09.06 16:33
Titel: HEY TOLL,
danke, Martok, genau danach habe ich gesucht. Wusste bisher nicht dass es auch eine solche Form der Zuweisung gibt. Also wieder was gelernt!
Mache somit das Thema zu. Nochmals Dank an alle Mittäter!
Torsten
|
|
|