Autor Beitrag
torstena
Hält's aus hier
Beiträge: 11

WinXP pro
Delphi 7
BeitragVerfasst: 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  { Datenstruktur mit allen erforderlichen Einträgen und Methoden für LZListe }
  TLZItem = class
    { Adresse der Zelle im StringGrid }
    Spalte, Zeile: Byte;
    { In diesem Feld möchte ich den Verweis auf die an die StringGrid-Objekte gebundenen WerteListen speichern }
    PWerteListe: Pointer;
    constructor Create(Sender: TObject; Col, Row: Byte);
  end;


Deren Konstruktor sieht dann so aus:
ausblenden 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, ...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  { Liste zur Speicherung von Datenstrukturen des Typs TLZItem }
  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?
ausblenden 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); 
{ Hier klemmts!!! Fehlermeldung: Record, Objekt oder Klassentyp erforderlich }
  end;
  { und so weiter }
  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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: So 17.09.06 00:11 
Titel: Re: TList verweist auf andere TList in Objects von StringGri
user profile icontorstena 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 Threadstarter
Hält's aus hier
Beiträge: 11

WinXP pro
Delphi 7
BeitragVerfasst: 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.:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  { Datenstruktur mit allen erforderlichen Einträgen und Methoden für LZListe }
  TLZItem = class
    { Adresse der gesetzten Zelle }
    Spalte, Zeile: Byte;
    WerteListe: TWerteListe;
    constructor Create(Sender: TObject; Col, Row: Byte);
  end;


Jetzt beschwert sich der Compiler in meinem Konstruktor
ausblenden 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



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 11

WinXP pro
Delphi 7
BeitragVerfasst: 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?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
type
  { Datenstruktur mit allen erforderlichen Einträgen und Methoden für LZListe }
  TLZItem = class
    { Adresse der gesetzten Zelle }
    Spalte, Zeile: Integer;
{ Bin hier Martoks Tipp gefolgt }    
    WerteListe: TWerteListe;
    constructor Create(Sender: TObject; Col, Row: Integer);
  end;

  { Liste zur verketteten Speicherung von Datenstrukturen des Typs TLZItem }
  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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
constructor TLZItem.Create(Sender: TObject; Col, Row: Integer);
begin
  inherited Create;
  Spalte := Col;
  Zeile := Row;
//  WerteListe := (Sender as TStringGrid).Objects[Spalte, Zeile];
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: So 17.09.06 16:18 
Titel: Re: TList verweist auf andere TList in Objects von StringGri
user profile iconMartok 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 11

WinXP pro
Delphi 7
BeitragVerfasst: 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