Ein Auswahlrahmen als Komponente

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Ein Auswahlrahmen als Komponente

Beitrag von wennerer »

Hallo Lazarus Freunde,
nachdem ich hier im Forum einiges über Komponentenentwicklung lernen durfte habe ich mich an eine Sache gemacht die mich schon länger beschäftigt.
Ob es so etwas oder so was ähnliches schon gibt bzw. ob außer mir jemand so was brauchen kann weiß ich nicht. Jedenfalls möchte ich die Komponente hier vorstellen und bin gespannt was ihr von der Idee und der Umsetzung haltet. Es handelt sich um einen Auswahlrahmen. Da ich keine Ahnung habe wie das auf Englisch heißt bekam er von mir den Namen Selector. In der Grundfunktion zieht man wie gewohnt einen Auswahlrahmen und kann dann die Auswahl verschieben und stretchen. Im Change Event werden die Koordinaten zurück gegeben. Schreibt man die Selector.Draw Methode in die Paint Procedure des Parent so zeichnet man in diesen.
Im Finished Event werden die notwendigen Daten zurückgegeben um die Auswahl in der Paintmethode selbst zeichnen zu können. Dies wird benötigt wenn weitere Zeichenoptionen in der Paint Procedure verarbeitet werden sollen. Für beide Varianten ist eine Demo dabei wo man besser erkennen kann was ich hier zu beschreiben versuche.
Wer mit dem Inhalt des Auswahlrahmens selber noch was machen möchte kann ein eigenes Popup Menü erzeugen. Wer dazu keine Lust hat kann ein vordefiniertes PopupMenü aktivieren. Dort sind bereits einfache Grafikroutinen umgesetzt.

Bildschirmfoto.png
Bildschirmfoto.png (103.88 KiB) 5107 mal betrachtet


Alle Funktionen im vordefinierten Popup befinden sich im Public-Bereich so dass sie auch ohne aktivieren des vordefinierten Popups selektiv verwendet werden können. Hier noch die weiteren Möglichkeiten aus dem Public Abschnitt. Die Beschreibungen der Published Properties werden (dank Siro) bei Anwahl unten im OI angezeigt und können dort gelesen werden.

procedure LastBitmap(var aBmp:TBitmap);
procedure Drawing(aCanvas:TCanvas);
function SelAreaToString: string;
function SelAreaLeftToString:string;
function SelAreaRightToString:string;
function SelAreaTopToString:string;
function SelAreaBottomToString:string;
function SelAreaWidthToString:string;
function SelAreaHeightToString:string;


//Rechteckkoordinaten des markierten Bereichs
property SelArea : TRect read FSelArea write SetSelArea;
//Ein und ausschalten des Selectors
property Enable : boolean read FEnable write SetEnable default false;
//Koordinaten Hintergrund Ausschnitt
property Background : TRect read FBackgrd write FBackgrd;
//diese Farbe wird transparent gezeichnet
property TransparentColor: TColor read FTransparentColor write SetTransparentColor default clWhite;
//Farbe für Stift Formfrei
property DemarcationColor: TColor read FDemarcationColor write SetDemarcationColor;

Hauptsächlich habe ich unter LinuxMint64bit getestet, aber eigentlich (hoffentlich) sollte auch alles unter Windows gehen?
Über Anregungen, sowie positive und auch negative Kritik würde ich mich sehr freuen!

Viele Grüße
Bernd

Hier die Release 3:
Dateianhänge
Release03.zip
(417.65 KiB) 156-mal heruntergeladen
Release01.zip
(78.99 KiB) 220-mal heruntergeladen
Zuletzt geändert von wennerer am Fr 16. Apr 2021, 20:39, insgesamt 2-mal geändert.

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Ein Auswahlrahmen als Komponente

Beitrag von sstvmaster »

Getestet unter Windows 10 mit 2.0.8 + 3.0.4 32bit, läuft!

Danke!
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Ein Auswahlrahmen als Komponente

Beitrag von m.fuchs »

wennerer hat geschrieben:
Di 7. Jul 2020, 20:41
Da ich keine Ahnung habe wie das auf Englisch heißt bekam er von mir den Namen Selector.
Das habe ich mich auch mal gefragt, die Antwort ist Rubberband also Gummiband. Vermutlich weil das Aufziehen mit der Maus dem Aufspannen mit einem Gummiring ähnelt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Ein Auswahlrahmen als Komponente

Beitrag von wennerer »

Hallo sstvmaster,
Danke für das Testen!! Ist schon mal beruhigend zu wissen das es bei dir läuft.

@m.fuchs: ich glaube es war ganz gut das ich die richtige Übersetzung nicht hinbekommen hab :lol:

Viele Grüße
Bernd

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

Re: Ein Auswahlrahmen als Komponente

Beitrag von Mathias »

Habe es unter Linux Mint getestet, läuft ohne Fehler.

Gibt es solche eine Komponente nicht schon in Lazarus ?
Im Objectinspector gibt es ja auch so ähnliche Rahmen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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: Ein Auswahlrahmen als Komponente

Beitrag von Winni »

Hi!

Beide Demos getestet unter Suse Tumbledweed: Läuft einwandfrei.

Aber: bei Beispiel 2 ist ne kleine Macke:

Wenn ich vom Modus "Selected" zurück zu "Drawing" will, dann reicht der Button nicht .
Ich muss auch ESC drücken, damit ich wieder dahin komme.

Winni

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Ein Auswahlrahmen als Komponente

Beitrag von wennerer »

Herzlichen Dank an euch beide für das Testen und die Rückmeldung!!

@Mathias: hat zwar nichts zu sagen aber ich habe bis jetzt nichts gefunden was in die Richtung geht.

@Winni: Ja hast du recht. Wenn der Auswahlrahmen aktiv ist muss er entweder mit Abbrechen oder Fertigstellen abgeschlossen werden um zeichnen zu können. Um das abzustellen braucht man aber bloß im aufrufenden Programm beim Anwählen des Zeichnens ein Selector1.PopMAbort(nil); einfügen. Schaut dann so aus:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject); //zeichnen
begin
 Selector1.PopMAbort(nil);
 inc(idx);
 setLength(OutPut,idx+1);
 Output[idx].Identifier:='Pencil';
 PenAktiv:=true;
end;   
 
Viele Grüße
Bernd

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

Re: Ein Auswahlrahmen als Komponente

Beitrag von siro »

Hallo Bernd,

bedankt für diesen wunderbaren Code habe ich mich ja schon.
Mir ist eben noch etwas aufgefallen:

Wenn ich im Popupmenü "Copy" auswähle, legst Du die Bitmap ins Clipboard,

Code: Alles auswählen

procedure TSelector.PopMCopy
....
ClipBoard.Assign(png);//ReturnBmp); 
----
Erstaunlicherweise kann ich es nicht Programmübergreifend z.B. in Irvanview oder OpenOffice einfügen.
Woran könnte dies liegen ?

Ich habe das grad mal mit einem Dreizeiler probiert TImage und dann ins Clipboard getan, da geht es.

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Ein Auswahlrahmen als Komponente

Beitrag von wennerer »

Hallo Siro,
habe ich nun schon öfter erfahren müssen, unter Linux geht's und crosskompiliert unter Wine läuft es auch.
Habe es nun erstmals native in Windows 10 getestet und da geht es nicht. Windows mag wohl so ohne weiteres keine png im Clipboard.
Mal auf die Schnelle ohne Transparenz geht's mit Bitmaps so:

ClipBoard.Assign(ReturnBmp);

oder so (ist ja das gleiche):

Code: Alles auswählen

procedure TSelector.PopMCopy(Sender: TObject); //kopieren
var PNG    :TPortableNetworkGraphic;
    img    : TImage;
begin

 if not self.Transparent then
  begin
   try
    //PNG:=TPortableNetworkGraphic.Create;
    //Png.Assign(ReturnBmp);
    img := TImage.Create(nil);
    img.Picture.Bitmap.Assign(ReturnBmp);
    ClipBoard.Assign(img.Picture.Bitmap);
    Enable:=false;
   finally
    //PNG.Free;
    img.Free;
   end;
  end else           
Vielleicht muss man für png noch ein Clipboardformat setzen. Muss ich mal in Ruhe herum probieren.

Viele Grüße
Bernd
Zuletzt geändert von wennerer am Mo 29. Mär 2021, 21:48, insgesamt 1-mal geändert.

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

Re: Ein Auswahlrahmen als Komponente

Beitrag von siro »

Ja Bernd, hast recht,
so geht das einwandfrei:

ClipBoard.Assign(ReturnBmp);

Danke Dir für die Info, dann lasse ich das doch einfach so. :wink:

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Ein Auswahlrahmen als Komponente

Beitrag von wennerer »

Hallo,
ich habe nun einiges zum Thema Zwischenablage in Windows gelesen. In allen Beiträgen wird allerdings die Meinung vertreten das das Einfügen von transparenten PNG's oder Bitmaps in Microsoft Programmen nicht möglich ist. Es soll wohl unter Windows nur wenige Grafikprogramme geben wo dies möglich wäre. Ich kann nicht sagen ob dies den Tatsachen entspricht.
Jedenfalls habe ich nun die Kopie- und die Ausschneiden-Funktionen so umgeschrieben das dies mit einen Memorystream geschieht. Bei meinen Tests konnte ich damit in Linux transparente und nicht transparente Inhalte über die Zwischenablage zum Beispiel in LibreOffice einfügen. In Windows ging die Transparenz beim Einfügen in Word oder Paint leider verloren.
Als Vorlage diente mir dieser Beitrag im internationalen Forum:
https://forum.lazarus.freepascal.org/in ... ic=40127.0

Weiterhin besitzt die Komponente nun die Möglichkeit mittels i18n die Sprache nach Englisch umzustellen. Ein Minibeispiel befindet sich in der Release 2 (die ich dem 1. Beitrag zugefügt habe).
Sollte jemand noch Probleme feststellen werde ich gerne versuchen diese zu beheben.

Viele Grüße
Bernd

Antworten