TLabel entfernen

Rund um die LCL und andere Komponenten
khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

hallo ulhau,
eben das letzte ist bei allen varianten das Problem.
Sind das denn sehr viele Labels? So das sie nicht schon im Formulareditor erzeugt werden können (Visible := Fals;).
wäre ne Möglichkeit, ich denke aber das ist keine saubere Lösung :-(
Gruss KH

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@all
ich hab mal bei der "Konkurenz" recherchiert ;-)
Unter Delphi funktioniert folgende Lösung :

Code: Alles auswählen

unit Unit1;
 
interface
 
uses
  Windows, Messages, Classes, Graphics, Controls, Forms, StdCtrls;
 
const
   WM_KILL_CONTROL = WM_USER+ 66;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    CheckBox1: TCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure Button1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private-Deklarationen }
    procedure WMKillControl(var msg:TMessage); message WM_KILL_CONTROL;
 
  public
    { Public-Deklarationen }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
procedure TForm1.WMKillControl(var msg: TMessage);
var
   c : TControl;
   i : Integer;
begin
   c := TControl(msg.LParam);
   if not Assigned(c) then
      Exit;
 
   c.Free;
   windows.MessageBeep($FFFFFFFF);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
//   Sender.Free;   // würde meistens eine Exception auslösen
   PostMessage(Self.Handle, WM_KILL_CONTROL, 0, Integer(Sender));
end;
 
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   if (Key=VK_DELETE) and (Shift=[ssCtrl]) then
   begin
   //   Sender.Free;   // würde meistens eine Exception auslösen
      PostMessage(Self.Handle, WM_KILL_CONTROL, 0, Integer(Sender));
   end;
end;
 
end.
leider krieg ich das unter Lazarus nicht hin :-(
wie kann ich das unter Laz handeln?

Gruss Kh

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

khh hat geschrieben:
PS das mit den
Wie sinnvoll das ist, kann ich nicht beurteilen, da khh immer nur "Schrittchen-Fragen" stellt
werde ich zukünfig beherzigen
Du würdest das besser sofort beherzigen ;-)

Es ist doch wieder so, dass keiner genau weiss weshalb du Labels auf ihr eigenes OnClick entfernen willst, bzw. was du überhaupt, im grösseren Zusammenhang erreichen willst.

Dann sucht man tagelang eine Lösung für das, was du als Problem betrachtest.
Vielleicht ist aber dein vermeintliches Problem schon eine Folge eines falschen Konzepts, welches man bei Kenntnis deines Ziels evtl. umdefinieren könnte.
Ich habe einen "Riecher" für Holzwege ;-)

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

Hallo Theo,
Es ist doch wieder so, dass keiner genau weiss weshalb du Labels auf ihr eigenes OnClick entfernen willst, bzw. was du überhaupt, im grösseren Zusammenhang erreichen willst.
ok, dann will ich das mal versuchen zu erklären.
Ich möchte auf einem canvas u.a. die Möglichkeit haben Text zu schreiben.
Der Inhalt des Canvas soll später als BMP gespeichert werden.
Zusätzlich müssen die Inhalte in einem Asciifile hinterlegt werden können.

Dazu erstelle ich per Klick ein Eingabefeld und übergebe den eingegebenen Text beim Verlassen des Tedit an ein Label, welches ich auf dem Canvas anzeige.
Nun soll der User aber die Möglichkeit haben, diesen Text beliebig oft auf dem Canvas anzulegen ,zu verschieben, zu löschen, anders zu formatieren usw.
Das Verschieben und Formatieren funktioniert ja einwandfrei.
Deshalb hatte ich die Idee im mousedown des jeweiligen Labels dieses zu entfernen.
@theo ist das sooo ein Holzweg ? ;-)

Wie würdet denn Ihr das umsetzen ?

Gruss KH

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ich würde den Text nach dem editieren direkt auf den Canvas zeichnen.
Das brauchst du ja sowieso, wenn du das als BMP speichern willst.
Halte eine Liste von Text-Objekten mit Koordinaten die du einfach OnPaint auf den Canvas malst.
Ich mach dir bei Gelegenheit mal ein Beispiel.

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@theo
Ich mach dir bei Gelegenheit mal ein Beispiel.
das ist nett von dir, danke

Gruss Kh

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Also hier:

Auswählen der "Labels" durch Click
Verschieben durch "ziehen".
Löschen mit delete.

Der Rest sollte klar sein.

Hab's nur auf GTK2 ein bisschen getestet.
Da kannst du noch viel verbessern und anpassen, aber ich glaube die Idee sollte klar sein.

P.S.: Das zarte Flackern beim Verschieben auf GTK kriegt man auch noch weg.
uses ...,Messages,...

//Dekl. bei TPaintControl.
procedure WMEraseBkgnd(var Msg: TMessage); message WM_ERASEBKGND;
....
procedure TPaintControl.WMEraseBkgnd(var Msg: TMessage);
begin
Msg.Result := 1;
end;
Dateianhänge
labels.zip
(4.32 KiB) 100-mal heruntergeladen

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@theo,
ich danke dir vielmals.
Genau so brauche ich es :-)

Gruss KH

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

khh hat geschrieben: ich danke dir vielmals.
Genau so brauche ich es :-)
Schon OK. Bringst mal einen Kasten Bier vorbei, wenn du das nächste Mal in die Schweiz fährst. ;-)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

@kkh, kannst dus bitte lassen hier geschützten code zu posten ? durch solche scheisse kommen aussagen zusatnde das open source code klaut u.s.w.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@christian
@kkh, kannst dus bitte lassen hier geschützten code zu posten ?
wo bitte hab ich das gemacht?
Falls du mein Posting vom 24.5. meinst,
Der Code stammt aus einer Veröffentlichung im Delphi-Forum, und ich denke nicht dass es sich hier um geschützten Code handelt.
Es sollte nur ein Beispiel sein was unter Delphi funktioniert und unter Lazarus nicht.
Ich sehe darin keinesfalls Codeklau.
Gruss KH

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@theo
Schon OK. Bringst mal einen Kasten Bier vorbei, wenn du das nächste Mal in die Schweiz fährst.
mach ich glatt ;-)

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@theo
alsooo
nach deinem "labels.zip" funktioniert das wunderbar.
Ich hab auch den Wechsel der Hintergrundfarbe integriert usw.
Jetzt möchte ich aber zusätzlich als Hintergrund _entweder_ die Farbe einstellen oder ein Bitmap laden.
mit
fCacheBuffer.Canvas.stretchDraw(rechteck,fBgBild);
in der paint procedure klappt das auch.
Leider hab ich dann aber den Text vor einem HG in der eingestellten Farbe.
Wie krieg ich das "Label" transparent?
Oder muss ich dazu einen anderen Weg gehen ?
Der gleiche " Fehler" ist übrigens bei MS Paint zu beobachten. Auch dort wird der Texthintergrund auf einem Bild weiss dargestellt.

Gruss KH

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Langsam solltest du dein eigenes Hirn einschalten khh. ;-)

Ist doch sogar schon vorbereitet:
In TPaintControl.Paint;
Style.Opaque := false;
setzen.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

was macht eigentlich die Einstellung: Style.Opaque := false;
die habe ich heute schon öfter getroffen.
MFG
Michael Springwald

Antworten