Eine Linie Zeichnen
-
- Beiträge: 478
- Registriert: Fr 13. Sep 2013, 12:07
- OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
- CPU-Target: 64Bit
- Wohnort: Rügen
Eine Linie Zeichnen
Hallo,
ich möchte eine Linie zeichnen in auf einem Panel von Punkt1 X1,Y1 nach Punkt Y1,Y2.
Wie und mit welchem Control kann ich das machen ?
Gruß Frank
ich möchte eine Linie zeichnen in auf einem Panel von Punkt1 X1,Y1 nach Punkt Y1,Y2.
Wie und mit welchem Control kann ich das machen ?
Gruß Frank
Re: Eine Linie Zeichnen
Dafür brauchst du keine Extra Komponente.
Ein Panel hat ein OnPaint Ereignis, da drin malst du auf den Canvas.
Ein Panel hat ein OnPaint Ereignis, da drin malst du auf den Canvas.
Code: Alles auswählen
P1.Canvas.Pen.Color:= clRed;
P1.Canvas.MoveTo(5,5);
P1.Canvas.LineTo(25,25);
-
- Beiträge: 478
- Registriert: Fr 13. Sep 2013, 12:07
- OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
- CPU-Target: 64Bit
- Wohnort: Rügen
Re: Eine Linie Zeichnen
... ahha Danke. 

-
- Beiträge: 20
- Registriert: Di 31. Jan 2017, 19:46
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Berlin
Re: Eine Linie Zeichnen
Wenn du auf dem Panel viel zeichnest (Farben änderst usw.), könnte für dich With ** do ** interessant sein, da es eine verkürzte Schreibweise ermöglicht:
Code: Alles auswählen
With P1.Canvas do begin
// bei jeder Anweisung die sich nun auf P1.Canvas bezieht, kannst du nun das "P1.Canvas." weglassen
Pen.Color:= clRed; // anstelle von [u]P1.Canvas.[/u]Pen.Color:= clRed;
MoveTo(5,5);
LineTo(25,25);
end:
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Eine Linie Zeichnen
Code: Alles auswählen
MoveTo(5,5);
LineTo(25,25);
Code: Alles auswählen
Line(5, 5, 25, 25);

Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Eine Linie Zeichnen
...und somit zur Unleserlichkeit, erschwertem Debugging und komplett überflüssigen Fehlern führt...tightTannic hat geschrieben:könnte für dich With ** do ** interessant sein, da es eine verkürzte Schreibweise ermöglicht:
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Eine Linie Zeichnen
Darüber könnte man streiten, in solchen Fällen finde ich es mit with auch übersichtlicher.theo hat geschrieben:...und somit zur Unleserlichkeit, erschwertem Debugging und komplett überflüssigen Fehlern führt...tightTannic hat geschrieben:könnte für dich With ** do ** interessant sein, da es eine verkürzte Schreibweise ermöglicht:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Eine Linie Zeichnen
With, so wie derzeit in Pascal implementiert, ist generell ein unsicheres Konstrukt, aber gerade in solchen Fällen auf jeden Fall zu vermeiden.
Bist du sicher, dass du die Namen aller Members von TCanvas inklusive der in Vorfahrklassen vorkommenden Properties und Datenfelder immer präsent hast?
Wenn du zufällig irgend eine (lokale oder globale) Variable oder vielleicht eine Property der Form so nennst wie eine Property des TCanvas (oder eines Vorfahren) und die im Inneren des with-Blocks verwendest, dann bekommst du keinerlei Warnung, aber das Programm arbeitet mit einer ganz anderen Variablen als mit der, von der du das glaubst, mit möglicherweise völlig rätselhaften Folgefehlern, die dann u.U. erst an ganz anderen Stellen des Programms sichtbar werden.
Ganz abgesehen davon, dass du nie wissen kannst, ob in einer späteren Version der LCL vielleicht eine TCanvas-Property mit so einem Namen eingeführt wird. Viel Spaß dann bei der Fehlersuche, wenn du die Lazarus/FPC Version aktualisierst und dein Programm plötzlich Mist macht.
Bist du sicher, dass du die Namen aller Members von TCanvas inklusive der in Vorfahrklassen vorkommenden Properties und Datenfelder immer präsent hast?
Wenn du zufällig irgend eine (lokale oder globale) Variable oder vielleicht eine Property der Form so nennst wie eine Property des TCanvas (oder eines Vorfahren) und die im Inneren des with-Blocks verwendest, dann bekommst du keinerlei Warnung, aber das Programm arbeitet mit einer ganz anderen Variablen als mit der, von der du das glaubst, mit möglicherweise völlig rätselhaften Folgefehlern, die dann u.U. erst an ganz anderen Stellen des Programms sichtbar werden.
Ganz abgesehen davon, dass du nie wissen kannst, ob in einer späteren Version der LCL vielleicht eine TCanvas-Property mit so einem Namen eingeführt wird. Viel Spaß dann bei der Fehlersuche, wenn du die Lazarus/FPC Version aktualisierst und dein Programm plötzlich Mist macht.
-
- Beiträge: 760
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Eine Linie Zeichnen
Ich fand die "With" Anweisung bisher SEHR übersichtlich und würde mich freuen wenn es so etwas auch in "C" geben würde.
Das erhöht ungemein die Lesbarkeit des Codes. Ich hatte da bisher noch keine Probleme mit, muss aber zugeben, dass ich
auch so einige Male auf einem falschen Canvas gezeichnet habe, da ich garkeinen Verweis angegeben habe.
Wenn die .paint Methode den canvas übergeben würde, wären viele Probleme beseitigt, wobei man den ja über Sender. ermitteln kann.

Das erhöht ungemein die Lesbarkeit des Codes. Ich hatte da bisher noch keine Probleme mit, muss aber zugeben, dass ich
auch so einige Male auf einem falschen Canvas gezeichnet habe, da ich garkeinen Verweis angegeben habe.

Wenn die .paint Methode den canvas übergeben würde, wären viele Probleme beseitigt, wobei man den ja über Sender. ermitteln kann.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 351
- Registriert: Mi 25. Nov 2015, 17:06
- OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
- CPU-Target: i386 + x86_64
- Wohnort: in der Nähe von Stuttgart
- Kontaktdaten:
Re: Eine Linie Zeichnen
Deswegen passt man auf wie man seine Variablen nenntbraunbär hat geschrieben:Wenn du zufällig irgend eine (lokale oder globale) Variable oder vielleicht eine Property der Form so nennst wie eine Property des TCanvas (oder eines Vorfahren) und die im Inneren des with-Blocks verwendest, dann bekommst du keinerlei Warnung, aber das Programm arbeitet mit einer ganz anderen Variablen als mit der, von der du das glaubst, mit möglicherweise völlig rätselhaften Folgefehlern, die dann u.U. erst an ganz anderen Stellen des Programms sichtbar werden.

Kannst du dir bei nichts sicher sein. Ist bei Klassen, Units, Methoden, Funktionen, ... genau das gleichebraunbär hat geschrieben:Ganz abgesehen davon, dass du nie wissen kannst, ob in einer späteren Version der LCL vielleicht eine TCanvas-Property mit so einem Namen eingeführt wird. Viel Spaß dann bei der Fehlersuche, wenn du die Lazarus/FPC Version aktualisierst und dein Programm plötzlich Mist macht.
Code: Alles auswählen
InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Eine Linie Zeichnen
Nein. Das Problem hast du nur in Verbindung mit dem with Statement. Sonst kann es dir prinzipiell egal sein, ob irgendwo ein neuer, zusätzlicher Variablenname eingeführt wird, der kann bestehenden Code nicht brechen.compmgmt hat geschrieben: Ist bei Klassen, Units, Methoden, Funktionen, ... genau das gleiche
Außer in Verbindung mit globalen Variablen, von deren Verwendung ja ebenfalls abgeraten wird. Ich habe in jedem Projekt eine unit GlobalData, in der ich alle im Projekt verwendeten globalen Daten in einem record gd zusammenfasse, und der Zugriff auf eine globale Variable im Programm erfolgt deshalb immer über gd.Variablenname.
"Sehr übersichtlich" hat nichts mit unsicher zu tun. Das Problem besteht darin, dass Änderungen an einer ganz anderen Stelle des Programms bestehenden Code brechen können. In einem kleinen 100 Zeilen Programm ist das wohl kein Problem, aber bei größeren Projekten ist es ein absolutes Nogo. Es ist uns einmal passiert (seinerzeit noch mit Turbo Pascal), und die Folgen waren verheerend - Falsche Daten in Datenbanken draußen bei den Kunden, die Ursache haben wir 2 Wochen gesucht, bis wir endlich draufgekommen sind. Seither war das with Statement absolut tabu.siro hat geschrieben:Ich fand die "With" Anweisung bisher SEHR übersichtlich
Zuletzt geändert von braunbär am Mo 14. Aug 2017, 10:34, insgesamt 1-mal geändert.
-
- Beiträge: 351
- Registriert: Mi 25. Nov 2015, 17:06
- OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
- CPU-Target: i386 + x86_64
- Wohnort: in der Nähe von Stuttgart
- Kontaktdaten:
Re: Eine Linie Zeichnen
Ich meinte damit, dass es auch durchaus sein kann, dass es in Lazarus irgendwann mal eine unit, Klasse oder sonst irgendwas geben könnte, die so heißt wie eine von dir. Das ist kein größeres Problem, bedarf aber einer eventuellen (kleinen) Umschreibung deines Programms.braunbär hat geschrieben:Nein. Das Problem hast du nur in Verbindung mit dem with Statement. Sonst kann es dir prinzipiell egal sein, ob irgendwo ein neuer, zusätzlicher Variablenname eingeführt wird, der kann bestehenden Code nicht brechen.compmgmt hat geschrieben: Ist bei Klassen, Units, Methoden, Funktionen, ... genau das gleiche
Außer in Verbindung mit globalen Variablen, von deren Verwendung ja ebenfalls abgeraten wird. Ich habe in jedem Projekt eine unit GlobalData, in der ich alle im Projekt verwendeten globalen Daten in einem record gd zusammenfasse, und der Zugriff auf eine globale Variable im Programm erfolgt deshalb immer über gd.Variablenname.
Und ich finde die Nutzung von "with" durchaus praktisch. Bei meiner Schaltplansoftware habe ich bspw eine Stelle, bei dem eine StringListe mit 120 hard gecodeten Strings befüllt wird (Weil die Sprache Deutsch als einzige hard gecoded ist, alle anderen Sprachen sind dynamisch). Da ist so etwas durchaus nützlich.
Code: Alles auswählen
InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Eine Linie Zeichnen
Siehe Post unmittelbar darüber - das Editieren hat sich mit deinem Post überschnitten.compmgmt hat geschrieben:Und ich finde die Nutzung von "with" durchaus praktisch.
Der potentielle Schaden durch ein with kann den Nutzen, der aus dem Weglassen eines Bezeichners resultiert, um ein vielfaches übersteigen. Statt zwei Wochen Fehlersuche und den Ärger mit den Kunden hätte ich liebend gerne auf alle With-Statements, die wir je in unseren Programmen verwendet haben, verzichtet. Aber es gibt wahrscheinlich Erfahrungen, die jeder einmal selbst machen muss...
compmgmt hat geschrieben:Ich meinte damit, dass es auch durchaus sein kann, dass es in Lazarus irgendwann mal eine unit, Klasse oder sonst irgendwas geben könnte, die so heißt wie eine von dir. Das ist kein größeres Problem, bedarf aber einer eventuellen (kleinen) Umschreibung deines Programms.
Außer in Verbindung mit with ist es gar kein Problem. Wenn du etwas lokal definierst, hat das Priorität gegenüber einer globaleren Definition. Aber in Verbindung mit with kann es zu einem ernsten Problem werden, weil der Compiler dich nicht darauf hinweist (und das auch gar nicht kann), dass sich die Semantik deines Codes gegenüber früher geändert hat.
Es wäre sehr leicht, aus dem unsicheren with-Konstrukt durch geringfügige Syntax-Änderung ein sicheres Konstrukt zu machen. Schade ist, dass das nicht gemacht wird.
So etwas würde ich nicht mit einer Stringlist, sondern mit einem initialisierten String-array machen. Wozu zur Laufzeit initialisieren?Bei meiner Schaltplansoftware habe ich bspw eine Stelle, bei dem eine StringListe mit 120 hard gecodeten Strings befüllt wird