ListView -> ListItem kann ich in Data Objekte speichern

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

ListView -> ListItem kann ich in Data Objekte speichern

Beitrag von af0815 »

Eine ListView beinhaltet ja ListItems und diese haben eine property Data vom Typ pointer.

Kann ich Objekte diesem Zeiger zuweisen und später verwenden?

Bsp:

Code: Alles auswählen

 
 TGITLogItem = class
    private
      FAuthor: String;
      procedure SetAuthor(AValue: String);
    public
      constructor Create;
      destructor Destroy; override;
    published
      property Author : String read FAuthor write SetAuthor;                            // %an: author name
    end;
 

Code: Alles auswählen

 
          ALogItem := TGITLogItem.Create;
          ALogItem.Author:= FromSomeThing;
 
.....
      with ListView1.Items.Add do begin
           Data := ALogItem;
           .......
      end;
.....
 

später

Code: Alles auswählen

 
procedure TGITLogForm.ListView1SelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
var
  ALogItem : TGITLogItem;
begin
  ALogItem := Item.Data
  ......
end;
 

Ich habe das Konstrukt (noch) nicht versucht, aber ist es möglich nur über den Pointer das Objekt weiter zu reichen ? Oder gibt es elegantere Lösungen ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: ListView -> ListItem kann ich in Data Objekte speichern

Beitrag von charlytango »

af0815 hat geschrieben: Oder gibt es elegantere Lösungen ?


ja, ich denke schon:
Nimm den Codegenerator von m.fuchs, der hat mir gute Dienste geleistet
http://www.michael-fuchs.net/rubriken/edv/tools/fcgt/

der schreibt dir im nu eine Objektliste

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ListView -> ListItem kann ich in Data Objekte speichern

Beitrag von af0815 »

charlytango hat geschrieben:der schreibt dir im nu eine Objektliste

Was nutzt mir die ? Ich muss die Info in das ListItem bringen, den die ListView aktzeptiert halt nur dies ListItem's. Und die ListItems haben halt nur Data vom Typ Pointer dafür zur Verfügung.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: ListView -> ListItem kann ich in Data Objekte speichern

Beitrag von wp_xyz »

Aber dein TGITLogItem ist doch auch ein Pointer - das geht 100%ig. Du musst TListItem.Data nur beim Auslesen wieder nach TGITLogItem casten, um auf die Methoden und Properties dieser Klasse zugreifen zu können. In deinem SelectItem-Code würde ich zur Sicherheit noch diese Typumwandlung explizit hinschreiben (aber vielleicht macht das der Compiler auch automatisch):

Code: Alles auswählen

 
procedure TGITLogForm.ListView1SelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
var
  ALogItem : TGITLogItem;
begin
  ALogItem := TGITLogItem(Item.Data);
  ......
end;

Problematisch ist wie immer bei solchen Sachen, dass das Aufräumen richtig funktioniert. Wem "gehören" die TGITLogItems?

Du fragst nach etwas Eleganterem: Falls du die ListView im ReportModus betreibst, also quasi als Grid-Ersatz, könntest du über VirtualTreeView nachdenken. Ob es letzendlich eleganter ist, weiß ich nicht.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ListView -> ListItem kann ich in Data Objekte speichern

Beitrag von af0815 »

wp_xyz hat geschrieben:Du fragst nach etwas Eleganterem: Falls du die ListView im ReportModus betreibst, also quasi als Grid-Ersatz, könntest du über VirtualTreeView nachdenken. Ob es letzendlich eleganter ist, weiß ich nicht.

Ja, ich betreibe die Listview im Reportmodus, aber das ist nicht mein Problem, die ListView reicht da vollkommen aus.

Ich bin gerade dabei sowas wie das LazSVNPkg für GIT zu schreiben. Sprich das ich aus Lazarus heraus die grundlegensten Befehle absetzen kann. Da kommt es oft vor, das ich durch die Auswahl in einer ListView, Daten in andere ListView/Memos einfülle. Wenn dann der Benutzer einen Eintrag selektiert, so hätte ich gerne das Objekt, mit den Information, mit der das ListView Element gefüllt wurde. In das ListViewElement werden ja nur ein paar Informationen für die Visualisierung eingefüllt, der Rest bleib ja in der zugrunde liegenden Liste. Daher ist auch die Verantwortlichkeit für die Objekte kein Problem und sauber zu handhaben.

Viele Befehle werde ich vorerst nicht implementieren, Log, Commit . Wenn es ausser mir noch wer verwendet, dann kann man mal sehen, was man so noch benötigt. Momentan schaffe ich mir mal die Basics, ich muss mich mit dem Interface der IDE beschaäftigen und die zig. unterschiedlichen Kommandos von GIT begreifen, auch wie man die am besten automatisieren kann. Da ist ein ziemlicher Wildwuchs bei GIT, keine richtige Linie drinnen. Mal kann man mit 'porcelain' arbeiten, mal anders. Ist irgendwie so, als hätten viele Leute unterschiedliche Ideen gehabt und auch ausgelebt.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten