TList Eintrag verändern, nicht löschen!

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Warf
Beiträge: 2118
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TList Eintrag verändern, nicht löschen!

Beitrag von Warf »

Tipp für generics, lieber

Code: Alles auswählen

TMyList = class(specialize ...);
Als

Code: Alles auswählen

TMyList = specialize ...
Grund dafür ist das generics sowohl in Lazarus code tools (auto complete, jump to implementation, etc) als auch im FPC etwas zickig sein können, und wenn man einen neuen Klassentypen definiert der von generics erbt statt selbst die specialization zu sein ist das deutlich robuster.

Als Grund vermute ich weil hier ein neuer Typ mit eigenem Namen angelegt wird statt einem alias auf den specialized Namen, der ein gemangelter Name aus dem Typen und den Parametern ist. Somit werden einige kuriose bugs, internal errors und andere Späße umgangen die sonst auftreten können

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TList Eintrag verändern, nicht löschen!

Beitrag von Mathias »

Grund dafür ist das generics sowohl in Lazarus code tools (auto complete, jump to implementation, etc) als auch im FPC etwas zickig sein können, und wenn man einen neuen Klassentypen definiert der von generics erbt statt selbst die specialization zu sein ist das deutlich robuster.
Diese zickige verhalten kenne ich auch, ich habe da einen etwas speziellen type helper.
Da hat codetools auch recht Mühe die Methoden mit [Ctrl+Space] zu finden.

Code: Alles auswählen

PStreamer = type PGstElement;

  PStreamerHelper = type Helper for PStreamer
  private
    function GetDuration: TGstClockTime;
    procedure SetVolume(vol: Tgdouble);
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

multiplatform-coder
Beiträge: 59
Registriert: Do 20. Apr 2023, 18:25

Re: TList Eintrag verändern, nicht löschen!

Beitrag von multiplatform-coder »

Hallo,

Ich habe es jetzt mit Generics gemacht, erhalte aber das gleiche Ergebnis, die Werte ändern sich nicht, ich habe mal ein Beispiel für ein gedachtes Pagecontrol gebaut, dessen implemetierung ich unabhängig von derjenigen der LCL wie folgt implementieren will:

<Eine Datenbank könnte ebenso realisiert werden, das gedachte PageControl ist nur ein Beispiel das mir eingefallen ist, wo diese Listenstruktur nützlich sein könnte>

Code: Alles auswählen

    TMyTabCtls = class;
    TControlsList = specialize TFPGObjectList<MyControl>; // Zum Bespiel Engabezeile, Listbox, Radiobutton, Checkbox,...
                                                                                              // oder auch Datenfelder einer Datenbank, wobei dann die 
                                                                                              // TabPages Liste von hier die Datensätze repasentieren würden  
                                                                                              // und die Controls die Datenfelder je Datensatz
    TMyTabCtls = class
      Controls: TControlsList;
      constructor Create;
    end;

    TMyTabPages = specialize TFPGObjectList<TMyTabCtls>;

    var
    myPages: TMyTabPages;
    myCts: TMyTabCtls;

    aTabNum:dword;    //aktuell aktiver Tab bzw aktive Tabseite
    
    begin
    aTabNum := X;

      if (thetabs < myPages.Count) and (thetabs <> aTabNum) then
      begin
        for thetabs := 0 to myPages[thetabs].Controls.Count-1 do
         if thetabs < mypages.Count then
         begin
           mypages[thetabs].Controls[thectls].active:=false;
         end;
      end;

      if thetabs=aTabNum then
      begin
        for thetabs := 0 to myPages.Count-1 do
         for thectls:=0 to myPages[thetabs].Controls.Count-1 do   //Controls sind das was ich auf der Tabseite anzeigen will
           if thetabs < mypages.Count then
           begin
             mypages[thetabs].Controls[thectls].active:=true;
           end;


      end;
ich will die Controls auf den nicht aktiven Tabseiten deaktivieren, aber nicht aus der Liste löschen, eine neue Tabseite soll dann die temporär deaktivierten Controls mit den aktuellen überschreiben. Die Liste soll aber erhalten bleiben um auf die Controls bei Tabseitenwechsel wieder zugreifen zu können :x .

In einer Datenbankanwendung könnte ich dann, solange die Liste im Speicher ist, wahlfrei auf alle Datenfelder in jedem Datensatz zugreifen ohne von Festplatte nachladen zu müssen, sollte also nichts ungewöhnliches sein was ich erreichen will.

Ich muss doch irgendwie die Listenelemente beeinflussen können, Werte ändern u.a.

Ist da etwa noch ein Fehler im obigen Algorithmus? Aber wo ist mein Denkfehler dann?

multiplatform-coder
Beiträge: 59
Registriert: Do 20. Apr 2023, 18:25

Re: TList Eintrag verändern, nicht löschen!

Beitrag von multiplatform-coder »

Ich Dussel! Wenn ich den aktuellen Tab haben will um die Einträge dort, entweder Datensatz oder eben einer Tabseite oder was auch immer, darf ich natürlich nur diesen einen Tab, Datensatz oder was auch immer abfragen und nicht alle duchzählen. Ok, funktioniert jetzt, ich habe meinen Code passend geändert und nur noch die aktuele TabNr. an die Exec Prozedur gesendet. Dann funktioniert das Ganze auch. Man sollte eben nicht noch am späten Abend programmieren, da schleichen sich unnötige Fehler ein. :lol:

Antworten