Generelles zum Umstieg Lazarus

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
PascalDragon
Beiträge: 955
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Generelles zum Umstieg Lazarus

Beitrag von PascalDragon »

siro hat geschrieben: Do 12. Aug 2021, 07:27 HeapTrc Fenster:
Ich finde das "Error" Fenster übrigens auch immer wieder verwirrend.
Ein "Einzeiler" würde die Verwirrung, grade bei NeuEin/Umsteiger beseitigen.
if unfreed Blocks = 0 then caption:='no error'; :wink:
Das geht nicht, da die Ausgabe von heaptrc nämlich einfach nur ein Write auf StdErr ist, welches unter Windows für ein GUI Program darauf gemappt ist einen Fehlerdialog zu zeigen. heaptrc hat schlichtweg keine Ahnung, dass da ein Dialog angezeigt wird.

Kompiliere das folgende Programm einfach einmal mit -WG und einmal ohne (oder setze $AppType entsprechend) und lass es laufen, um zu sehen was ich meine:

Code: Alles auswählen

program tstderr;

begin
  Writeln(StdErr, 'Hello World');
end.         
FPC Compiler Entwickler

Benutzeravatar
Jim Knopf
Beiträge: 98
Registriert: So 18. Mai 2014, 15:16
OS, Lazarus, FPC: Win10
CPU-Target: 64Bit
Wohnort: Klagenfurt
Kontaktdaten:

Re: Generelles zum Umstieg Lazarus

Beitrag von Jim Knopf »

Hallo wp_xyz,
wp_xyz hat geschrieben: Do 12. Aug 2021, 00:30 Nein, das ist kein Fehler, das ist die Ausgabe von heaptrc, ...
Die letzte "2" in V2.2 ist eine gerade Zahl ...
Danke für deine Informationen. Das ist sehr hilfreich im Umgang mit den Versionsnummern - und auch beruhigend bezüglich des ›Fehlers‹.
wp_xyz hat geschrieben: Do 12. Aug 2021, 00:30
Jim Knopf hat geschrieben: Mi 11. Aug 2021, 22:55 Noch kann ich es drehen und wenden, ich finde das Handling von dieser TreeView superkompliziert. Wenn ich das mit dem DevExpress-Grid vergleiche, dann kommt mir das viel einfacher vor.
Klar, bei dem DevExpress-Grid ist vieles in Properties schon fest eingebaut, was du hier noch einzeln über die Events implementieren musst. Du könntest dir aber natürlich eine neue, auf TVirtualStringTree basierende Klasse erzeugen, in der auch mehr schon vorbereitet ist. Leider kenne ich das DevExpress-Grid nicht, und kann dir konkret nicht dabei helfen, wo man genau ansetzen müsste. Auf jeden Fall wird intern in dem DevExpress-Grid etwas ähnliches ablaufen wie bei dem VirtualstringTree.
Ich muss gestehen, dass ich eine ziemliche Niete bin, wenn es darum geht, mich auf die Programmphilosophie eines anderen Programmierers einzustimmen. Unterm Strich bin ich schneller, selbst etwas zu machen; und in diesem konkreten Fall wäre es auch insofern hilfreich, als ich die Methoden gleich benennen könnte wie die von DevEx, was die Konvertierung gewaltig erleichtern würde. Aber vielleicht übernehme ich mich ja auch - Daumendruck hilft vielleicht :-)

Viele Grüße
Martin

siro
Beiträge: 760
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Generelles zum Umstieg Lazarus

Beitrag von siro »

@PascalDragon:
Ah, jetzt geht mir ein Licht auf,
das habe ich natürlich gleich mal ausprobiert.
Jo, deshalb erscheint da auch immer "error" alles klar.
Hab vielen Dank für die Info PascalDragon.
Error_HeapWindow.jpg
Error_HeapWindow.jpg (4.32 KiB) 1608 mal betrachtet
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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

Re: Generelles zum Umstieg Lazarus

Beitrag von wp_xyz »

Jim Knopf hat geschrieben: Mi 11. Aug 2021, 22:55 Eine Frage an euch habe ich bezüglich TMS: Die haben mir Folgendes zurückgeschrieben:
We have heard of problems with Lazarus 2.0.12. We are in touch with the Lazarus team about this.
We recommend for now to use Lazarus 2.0.6 or 2.0.8 that should not be affected by this.
We hope the Lazarus team resolves the issues with 2.0.12 as soon as possible with a new release.
Oje. Das klingt wie: "Die anderen sind schuld", und wie wenn der Werkstudent, der sich um die Lazarus-Portierung gekümmert hat, seit Anfang des Jahres nicht mehr da ist. Im Ernst: Ich kann mir nicht vorstellen, dass man ein Problem mit der Entwicklungsumgebung nicht so umgehen kann, dass eine Bibliothek verwendbar bleibt; man muss halt etwas Arbeit reinstecken. Laz 2.0.12 gibt es seit Februar - die lassen sich also ein halbes Jahr Umsatz entgehen. Da sieht man, wie hoch die Priorität für Lazarus gesetzt ist (ganz niedrig). Ich fürchte, die 245 EUR kannst du abschreiben.

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

Re: Generelles zum Umstieg Lazarus

Beitrag von wp_xyz »

Jim Knopf hat geschrieben: Do 12. Aug 2021, 10:10 Unterm Strich bin ich schneller, selbst etwas zu machen; und in diesem konkreten Fall wäre es auch insofern hilfreich, als ich die Methoden gleich benennen könnte wie die von DevEx, was die Konvertierung gewaltig erleichtern würde. Aber vielleicht übernehme ich mich ja auch - Daumendruck hilft vielleicht :-)
Das glaube ich nicht. In irgendeiner Form wird es auf sowas wie VTV hinauslaufen, und Mike Lischke hat daran jahrelang gearbeitet. Aber wiegesagt, es müsste möglich sein, basierend auf VTV, ein DevExpress-ähnliches Grid zu schreiben. Welche Properties hast du denn im Auge? Gibt es eine Dokumentation zu dem Grid, so dass man ahnen kann, was da intern passiert und was nachzubauen ist?

PascalDragon
Beiträge: 955
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Generelles zum Umstieg Lazarus

Beitrag von PascalDragon »

siro hat geschrieben: Do 12. Aug 2021, 11:40 Hab vielen Dank für die Info PascalDragon.
Gerne. Viele wissen nicht, dass dies unter Windows so ist. ;)
wp_xyz hat geschrieben: Do 12. Aug 2021, 13:08 Gibt es eine Dokumentation zu dem Grid, so dass man ahnen kann, was da intern passiert und was nachzubauen ist?
Sie ist hier zum Herunterladen verfügbar (das ExpressGridPack) wobei ich jetzt nicht weiß, ob Jim Knopf das Grid3 oder das Grid4 verwendet.
FPC Compiler Entwickler

Benutzeravatar
Jim Knopf
Beiträge: 98
Registriert: So 18. Mai 2014, 15:16
OS, Lazarus, FPC: Win10
CPU-Target: 64Bit
Wohnort: Klagenfurt
Kontaktdaten:

Re: Generelles zum Umstieg Lazarus

Beitrag von Jim Knopf »

wp_xyz hat geschrieben: Do 12. Aug 2021, 13:08 Welche Properties hast du denn im Auge? Gibt es eine Dokumentation zu dem Grid, so dass man ahnen kann, was da intern passiert und was nachzubauen ist?
Die Dokumentation ist nicht das Problem, es gibt eine ausführliche Hilfe und ich habe auch den Quellcode.

Die beiden Hauptbereiche sind Columns und Nodes. Auf die Inhalte der Nodes greift man einfach über deren String-Property zu

Code: Alles auswählen

N.Strings[tc01.Index] := 'x';
tl.Invalidate;
wobei tcI01 der Name der Spalte ist. Man kann die Nodes direkt anspringen (TopNode, LastNode) oder durchiterieren (NextNode, PrevNode) usw.
Das Editieren im Grid ist lediglich von einem Property abhängig. Ist das an, kann man mit [F2] Zellen verändern, ein anderes bestimmt, ob und wie man zum nächsten gelangt usw.

Über CustomDrawCell kann man seine Zellen individuell zusammenmalen wie man es braucht (entspricht wohl dem TreeDrawText):

Code: Alles auswählen

procedure TfMain.tlCustomDrawCell(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxTreeListColumn;
  ASelected, AFocused, ANewItemRow: Boolean; var AText: String;
  var AColor: TColor; AFont: TFont; var AAlignment: TAlignment;
  var ADone: Boolean);
Warum hier mit einem eigenen Record, der die Spalten abbildet, gearbeitet werden muss, verstehe ich einfach nicht - ist doch auch eine Redundanz, die schnell ins Aug gehen kann, sobald man was ändert an den Spalten. Irgendwo müssen die Daten ja immer vorghehalten werden, warum nicht in einer TStrings, auf die man direkt zugreifen kann. Aber es ist eben eine andere Philosophie.

Die Properties sind auch nicht so das Thema, es sind eher die Methoden und Ereignisse. Würde man das alles ins VTV einbauen, dann bekäme das noch mehr von allem. Ich finde, ehrlich gesagt, es ist jetzt schon sehr ... na ja, sagen wir mal schon jetzt so gut mit Properties, Methoden und Ereignissen ausgerüstet, dass man eine ganze Weile braucht, um sich einzuarbeiten. Ich brauche nur einen kleinen teil, aber den eben möglichst identisch vom Ereignis-/Methodennamen und deren Parameterliste. Aber, wie gesagt, vielleicht liegt das auch nur daran, weil ich schon länger auf ein System eingeschossen bin. Allerdings bin ich nur deshalb in der Lage, wirklich schnell und effizient zu arbeiten.

Viele Grüße
Martin

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Generelles zum Umstieg Lazarus

Beitrag von Winni »

Hi!

bezgl heapTrace hab ich ein paar Zeilen code spendiert, damit man weiss, wo der Output letztendlich landete.

den Code in der .lpr nach dem ersten begin enfügen!

Code: Alles auswählen

const TraceName = './MyApp_trace.txt';
begin
 if UseHeapTrace then
  begin
   if FileExists(TraceName) then DeleteFile(TraceName);
   SetHeapTraceOutput(TraceName);
  end;          
RequireDerivedFormResource:=True;
Application.Initialize;    
....
Nun kann man in aller Ruhe in seinem Lieblingseditor die Datei ./MyApp_trace.txt lesen, ohne zu raten, wo der Text nun erschieint. Je nach OS und settings.

Winni

PS.:

Code: Alles auswählen

uses .......,sysutils;
Zuletzt geändert von Winni am Do 12. Aug 2021, 18:21, insgesamt 1-mal geändert.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Generelles zum Umstieg Lazarus

Beitrag von Winni »

Jim Knopf hat geschrieben: Do 12. Aug 2021, 10:10
Ich muss gestehen, dass ich eine ziemliche Niete bin, wenn es darum geht, mich auf die Programmphilosophie eines anderen Programmierers einzustimmen.
Hi!

Kenne ich. Da hilft nur eins: Vom Modus "Let's Do It" auf Enstpannen und ReadOnly schalten.
Je nach Neigung Gras oder Wein oder Bier. Zurücklehnen. Und dann langsam durch den Code scrollen. Und sich auf den Programmierstil einschwingen. Und versuchen zu verstehen, was der Mensch erreichen wollte. "Was wollte uns der Dichter damit sagen?" Fand ich schon als Schüler grässlich. Aber nützt ja nix.

Winni

Benutzeravatar
Jim Knopf
Beiträge: 98
Registriert: So 18. Mai 2014, 15:16
OS, Lazarus, FPC: Win10
CPU-Target: 64Bit
Wohnort: Klagenfurt
Kontaktdaten:

Re: Generelles zum Umstieg Lazarus

Beitrag von Jim Knopf »

Hi Winni,
Winni hat geschrieben: Do 12. Aug 2021, 18:20 Kenne ich. Da hilft nur eins: Vom Modus "Let's Do It" auf Enstpannen und ReadOnly schalten.
Weise Worte - wenns nur so einfach wäre ...

Viele Grüße
Martin

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

Re: Generelles zum Umstieg Lazarus

Beitrag von wp_xyz »

Jim Knopf hat geschrieben: Do 12. Aug 2021, 14:32 Warum hier mit einem eigenen Record, der die Spalten abbildet, gearbeitet werden muss, verstehe ich einfach nicht - ist doch auch eine Redundanz, die schnell ins Aug gehen kann, sobald man was ändert an den Spalten. Irgendwo müssen die Daten ja immer vorghehalten werden, warum nicht in einer TStrings, auf die man direkt zugreifen kann. Aber es ist eben eine andere Philosophie.
OK, dann hast du das Prinzip von VTV noch nicht verstanden. Vergiss den Record, es ist nur ein Beispiel, weil ich etwas handfestes brauchte, um das Demo-Programm zu machen.

VTV verwaltet die Nodes intern in TVirtualNode Records:

Code: Alles auswählen

type
  TVirtualNode = record
    Index,                   // index of node with regard to its parent
    ChildCount: Cardinal;    // number of child nodes
    NodeHeight: Word;        // height in pixels
    States: TVirtualNodeStates; // states describing various properties of the node (expanded, initialized etc.)
    Align: Byte;             // line/button alignment
    CheckState: TCheckState; // indicates the current check state (e.g. checked, pressed etc.)
    CheckType: TCheckType;   // indicates which check type shall be used for this node
    Dummy: Byte;             // dummy value to fill DWORD boundary
    TotalCount,              // sum of this node, all of its child nodes and their child nodes etc.
    TotalHeight: Cardinal;   // height in pixels this node covers on screen including the height of all of its
                             // children
    // Note: Some copy routines require that all pointers (as well as the data area) in a node are
    //       located at the end of the node! Hence if you want to add new member fields (except pointers to internal
    //       data) then put them before field Parent.
    Parent,                  // reference to the node's parent (for the root this contains the treeview)
    PrevSibling,             // link to the node's previous sibling or nil if it is the first node
    NextSibling,             // link to the node's next sibling or nil if it is the last node
    FirstChild,              // link to the node's first child...
    LastChild: PVirtualNode; // link to the node's last child...
    Data: record end;        // this is a placeholder, each node gets extra data determined by NodeDataSize
  end; 
Da steht drin, welche Nodes als Geschwister vorhanden sind, welcher Node das erste bzw. letzte Kind in der nächsten Hierarchieebene ist, ob der Node gecheckt ist, usw, usw.

Ganz am Ende steht das Feld "Data", das ist der Platz für die mit dem Node verbundenen Daten, wobei hierfür kein Datentyp festgelegt ist. Die Daten kann man z.B. so wie in meinem Beispiel als Record anbieten, oder aber auch über einen Pointer, der auf irgendwelche Strukturen zeigt, z.B. auch Datenobjekte in deiner eigentlichen Anwendung. Das ist absolut flexibel. Das einzig wichtige ist, dass du dem VTV sagst, wie groß das Feld Data ist - das geschieht mit dem Property NodeDataSize oder über das Ereignis OnGetNodeDataSize. Mit dieser Information reserviert der VTV dann für jeden Node die Größe des TVirtualNode plus die Größe des Datenbereichs (NodeDatasize). Wenn die Daten als Record vorliegen, wäre NodedataSize = SizeOf(...daten-record...). Wenn die Daten eine Instanz einer Klasse sind, wäre NodeDataSize = SizeOf(TDeineDatenKlasse) (oder einfacher SizeOf(TObject) oder SizeOf(Pointer)). Alles andere geschieht dann über die Events: Wenn z.B VTV einen Text in eine Zelle malen soll, wird das Ereignis OnGetCellText aufgerufen (mit Parameter Node und Spalte), und du lässt dir durch VTV.GetNodeData den Pointer zurückliefern, der auf deine Daten zeigt, und letztendlich entscheidet dann dein Eventhandler, wie der anzuzeigende Text in der betreffenden Spalte aus deinen Daten extrahiert wird.

Natürlich kannst du dir von TVirtualStringTree eine neue Klasse ableiten, in der schon vorgegeben ist, wie man die Zelltexte erhält, und damit könntest du via "Node.Strings[ColumnIndex]" auf den anzuzeigenden Text zugreifen.
Jim Knopf hat geschrieben: Do 12. Aug 2021, 14:32 Über CustomDrawCell kann man seine Zellen individuell zusammenmalen wie man es braucht (entspricht wohl dem TreeDrawText):

Code: Alles auswählen

procedure TfMain.tlCustomDrawCell(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxTreeListColumn;
  ASelected, AFocused, ANewItemRow: Boolean; var AText: String;
  var AColor: TColor; AFont: TFont; var AAlignment: TAlignment;
  var ADone: Boolean);
Heißt das, dass all die Icons in deinem Screenshot erst im CustomDrawCell angezeigt werden? Das macht die Umstellung viel einfacher, weil man im Node-Record dann keine Unmengen von ImageIndices und Formatierungsvorgaben (Bild links oder Bild rechts) vorhalten muss. VTV kann das dann nämlich alles schon.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Generelles zum Umstieg Lazarus

Beitrag von fliegermichl »

wp_xyz hat geschrieben: Do 12. Aug 2021, 23:35 Ganz am Ende steht das Feld "Data", das ist der Platz für die mit dem Node verbundenen Daten, wobei hierfür kein Datentyp festgelegt ist.
Genau und dadurch, daß ich mir noch davor ein weiteres Feld Daten : Pointer; definiert habe, kommt da mein Verweis zu meiner Klasseninstanz rein und in Data kann ich zusätzliche Daten verwalten, welche ich nur während der Lebenszeit des Trees brauche.

charlytango
Beiträge: 1061
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: Generelles zum Umstieg Lazarus

Beitrag von charlytango »

Nur eine Frage an die Experten -- ich habe in meinen Archiven ein VMWare-Image (WinXP) mit installiertem Delphi7 samt den DevExpress-Komponenten (samt Source) gefunden.
Konnte es auf VirtualBox migrieren.
Die könnte ich etwas rundlutschen (also alles individuelle entfernen) und euch zur Verfügung stellen.

Wäre das für jemand interessant?
Denn am Ersetzen des DevExpress Grids bin ich sehr interessiert ;)

PS: Das ist wie eine Reise in die Vergangenheit - seltsames Look And Feel

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

Re: Generelles zum Umstieg Lazarus

Beitrag von wp_xyz »

Na hoffentlich liest hier niemand von den Abmahnungsanwälten mit...

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Generelles zum Umstieg Lazarus

Beitrag von Winni »

Hi

Kalifornien ist weit und Amis können in den allermeisten Fällen kein Deutsch ....

Winni

Antworten