[gelöst] OnMouseEnter / OnMouse Leave zur Laufzeit (Fragen der Logik)

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
Levario
Beiträge: 101
Registriert: Mo 1. Sep 2014, 14:32
OS, Lazarus, FPC: Windows 10 Pro Laptop (Lazarus 3.0.0 FPC 3.2.2)
CPU-Target: 64 Bit
Wohnort: Deutschland / NRW

[gelöst] OnMouseEnter / OnMouse Leave zur Laufzeit (Fragen der Logik)

Beitrag von Levario »

Hallo zusammen,

die Funktionen funktionieren bei mir zur Laufzeit. Aber erzeuge ich verschiedene über eine Datenbank und möchte ein Panel Color ändern habe ich Probleme.
Damit nur das TPanel den Hintergrund ändert wenn ein ONMouseEnter bzw. OnMouseLeave und nicht alle zusammen. inti ist eine globale Variable.
ohne die If Anwendung werden alle Panel mit hellgrauem Hintergrund hinterlegt. Für eure Hilfe wäre ich sehr dankbar komme hier nicht weiter.

Code: Alles auswählen

procedure TMainForm.myOnEnter(Sender : TObject);
var
  i : integer;
  panelname : string;
begin
  for i := 1 to inti do
  begin
     panelname := 'MyPanel' + IntToStr(i);
   if (Sender is TMainForm(FindComponent(panelname))) then  { So stelle ich es mir vor könnte es gehen, aber er verweist auf das TMainForm beim kompilieren }
     begin
        TMainForm(FindComponent(panelname)).color := TColor($00333333);
     end;
  end;
end; 
Zuletzt geändert von Levario am Fr 17. Nov 2023, 08:48, insgesamt 1-mal geändert.
Der Weg ist das Ziel... Aber bitte nicht vergessen los zu laufen :).

wennerer
Beiträge: 524
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: [offen] OnMouseEnter / OnMouse Leave zur Laufzeit (Fragen der Logik)

Beitrag von wennerer »

Hallo,
ich verstehe leider nicht so ganz was du möchtest. Aber wenn die Maus in die Form Eintritt bzw. Austritt ist der Sender bei MouseEnter bzw. MouseLeave die Form. Wenn die Maus in ein Panel Eintritt bzw. Austritt ist der Sender bei MouseEnter bzw. MouseLeave das jeweilige Panel. Deshalb denke ich du musst für jedes Panel eine eigene MouseEnter und MouseLeave Prozedur erstellen. Teste mal das angehängte Projekt1, dann siehst du was ich meine.
Oder zu verbindest alle Panel.MouseEnter bzw Panel.MouseLeave in je einer Procedure. Dann kannst du mittels Sender differenzieren. Schau mal in Projekt2.

Falls ich dein Problem falsch verstanden habe vergiss einfach was ich geschrieben hab. :D

Viele Grüße
Bernd
Dateianhänge
project2.zip
(139.41 KiB) 59-mal heruntergeladen
project1.zip
(139.42 KiB) 57-mal heruntergeladen

Benutzeravatar
Levario
Beiträge: 101
Registriert: Mo 1. Sep 2014, 14:32
OS, Lazarus, FPC: Windows 10 Pro Laptop (Lazarus 3.0.0 FPC 3.2.2)
CPU-Target: 64 Bit
Wohnort: Deutschland / NRW

Re: [offen] OnMouseEnter / OnMouse Leave zur Laufzeit (Fragen der Logik)

Beitrag von Levario »

Projekt2 ist das was ich haben möchte. Allerdings dynamisch.

Meine Panel sind Buttons einer Taskleiste die individuell zur Laufzeit über eine Datenbank Abfrage erstellt werden. Diese können angepasst werden. Die Panels werden mit dem Namen MyPanel1 bis MyPanelN dynamisch erzeugt. Man kann die Funktionen aus deinem Beispiel bei mir nicht vordeinieren, da diese erst zur Laufzeit erzeugt werden.

Dein Code:

Code: Alles auswählen

  
 if Sender = Panel1 then Panel1.Color:= clLime;
 if Sender = Panel2 then Panel2.Color:= clYellow;
 if Sender = Panel3 then Panel3.Color:= clRed;
 if Sender = Panel4 then Panel4.Color:= clBlue; 
 
Da bei mir Panel 1 zum Zeitpunkt der Kompilierung nicht existiert, bekomme ich einen Fehler. Mein Code soll das gleiche wie deiner Code machen, nur halt über die Anzahl der Elemente in der Datenbank. Der Fehler ist in der IfAbfrage, anstelle des Panels identifiziert er hier das Form. Das ändern der Eigenschaft Color habe ich einzeln getestet und funktioniert so.

Mein Problem würde ich so beschreiben: Ich weis nicht wie ich in der Lage bin die erzeugten Panels zur Laufzeit richtig anzusprechen. Daher dieses Konstrukt mit dem FindComponent(). Wenn es bessere Lösungen gibt immer her damit :).

Code: Alles auswählen

procedure TMainForm.myOnEnter(Sender : TObject);
var
  i : integer;
  panelname : string;
begin
  for i := 1 to inti do {inti Anzahl der Erzeugten Panel beginnend mit 1}
  begin
     panelname := 'MyPanel' + IntToStr(i); {Namensgebung der erzeugten Panel}
     if (Sender is TMainForm(FindComponent(panelname))) then {Alle Panel sind im TMainForm über FindComponent möchte ich erzeugte Komponente suchen. Ich habe aktuell keine andere Lösung}
     begin
        TMainForm(FindComponent(panelname)).color := TColor($00333333); {Aufruf der Komponente und Farbänderung der Eigenschaft Color}
     end;
  end;
end;     
Der Weg ist das Ziel... Aber bitte nicht vergessen los zu laufen :).

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

Re: [offen] OnMouseEnter / OnMouse Leave zur Laufzeit (Fragen der Logik)

Beitrag von fliegermichl »

So ganz verstehe ich das Problem wohl nicht.
Du kannst doch OnMouseEnter und OnMouseLeave dem Panel, nachdem es erzeugt wurde direkt zuweisen.
Ich hab das hier mal durch TForm.OnShow simuliert.

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
    procedure PanelMouseEnter(Sender: TObject);
    procedure PanelMouseLeave(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormShow(Sender: TObject);
var i : integer;
    p : TPanel;
begin
 for i := 0 to 3 do
 begin
   p := TPanel.Create(Application);
   p.OnMouseEnter := @PanelMouseEnter;
   p.OnMouseLeave := @PanelMouseLeave;
   p.Parent := self;
   p.Left := i*100;
 end;
end;

procedure TForm1.PanelMouseEnter(Sender: TObject);
begin
  TPanel(Sender).Color := clRed;
end;

procedure TForm1.PanelMouseLeave(Sender: TObject);
begin
  TPanel(Sender).Color := clDefault;
end;

end.

wennerer
Beiträge: 524
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: [offen] OnMouseEnter / OnMouse Leave zur Laufzeit (Fragen der Logik)

Beitrag von wennerer »

Guten Morgen,
mir gehts wie fliegermichl. Aber vielleicht trifft mein Anhang das Problem?

Viele Grüße
Bernd
Dateianhänge
project1.zip
(139.44 KiB) 61-mal heruntergeladen

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

Re: [offen] OnMouseEnter / OnMouse Leave zur Laufzeit (Fragen der Logik)

Beitrag von fliegermichl »

wennerer hat geschrieben:
Do 16. Nov 2023, 06:37
Guten Morgen,
mir gehts wie fliegermichl. Aber vielleicht trifft mein Anhang das Problem?

Viele Grüße
Bernd
Dein Code funktioniert, ist aber unnötig kompliziert.
Wenn das MouseEnter/Leave aufgerufen wird, dann wird doch das betreffende Panel als Sender übergeben und die Farbe kann direkt gesetzt werden. Siehe PanelMouseEnter/Leave in meinem Beispiel oben.

wennerer
Beiträge: 524
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: [offen] OnMouseEnter / OnMouse Leave zur Laufzeit (Fragen der Logik)

Beitrag von wennerer »

Naja, das hab ich ja in meiner ersten Antwort in den Beispielprojekten schon vorgeschlagen. Aber er meint wohl was anderes.

Benutzeravatar
Levario
Beiträge: 101
Registriert: Mo 1. Sep 2014, 14:32
OS, Lazarus, FPC: Windows 10 Pro Laptop (Lazarus 3.0.0 FPC 3.2.2)
CPU-Target: 64 Bit
Wohnort: Deutschland / NRW

Re: [offen] OnMouseEnter / OnMouse Leave zur Laufzeit (Fragen der Logik)

Beitrag von Levario »

fliegermichl hat geschrieben:
Do 16. Nov 2023, 07:57
Dein Code funktioniert, ist aber unnötig kompliziert.
Wenn das MouseEnter/Leave aufgerufen wird, dann wird doch das betreffende Panel als Sender übergeben und die Farbe kann direkt gesetzt werden. Siehe PanelMouseEnter/Leave in meinem Beispiel oben.
Vielen Dank für die Hilfe. Ich habe es schlicht nicht verstanden, warum er den Panel identifizieren kann nur mit Sender.
Dieses Beispiel war die Lösung

Code: Alles auswählen

procedure TForm1.PanelMouseEnter(Sender: TObject);
begin
  TPanel(Sender).Color := clRed;
end;
Das Thema ist gelöst.
Der Weg ist das Ziel... Aber bitte nicht vergessen los zu laufen :).

Antworten