ButtonPanel: Ok-Button abfangen

Rund um die LCL und andere Komponenten
Antworten
Danccce
Beiträge: 16
Registriert: Do 17. Feb 2011, 11:48

ButtonPanel: Ok-Button abfangen

Beitrag von Danccce »

Hallo zusammen,

ich habe ein Formular via

Code: Alles auswählen

test:=Form2.ShowModal;
geöffnet. In dem Formular ein ButtonPanel platziert. Öffnen und schließen funktioniert gut.
Jetzt würde ich gerne, wenn ein Benutzer den Ok-Button drückt, die Eingaben im Formlar überprüfen und gegebenfalls einen Hinweis auf Fehleingaben anzeigen und nur bei richtigen Eingaben das Fenster schließen.
Jedoch ist mir dies nicht gelungen. Ich habe versucht das OnClick Ereignis des OK-Buttons auszuwerten:

Code: Alles auswählen

procedure TForm2.OKButtonClick(Sender: TObject);
begin
  Label7.Caption:='Here...';
  if Edit1.Text ='' then
  begin
     Edit1.SetFocus;
  end;
end;
So einfach funktioniert es aber leider nicht... :-(

Über Hilfe wäre ich sehr dankbar.
Besten Gruß

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

Re: ButtonPanel: Ok-Button abfangen

Beitrag von theo »

Setzte im zweiten Formular im Ereignis OnCloseQuery den Parameter CanClose entsprechend.

Danccce
Beiträge: 16
Registriert: Do 17. Feb 2011, 11:48

Re: ButtonPanel: Ok-Button abfangen

Beitrag von Danccce »

Danke für die Antwort. Hatte ich schon ausprobiert.
Trotzdem wird der Label nicht verändert, so als ob der Button-Druck gar nicht abgefangen würde.

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: ButtonPanel: Ok-Button abfangen

Beitrag von shokwave »

Also ich benutze für so etwas das ModalResult.

Code: Alles auswählen

if Form2.ShowModal=mrOK then
Im OnClick des Buttons der schließt wird es mit ModalResult:=mrOK; (mrCancel, mrYes, ...) gesetzt.
mfg Ingo

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

Re: ButtonPanel: Ok-Button abfangen

Beitrag von theo »

Danccce hat geschrieben:Danke für die Antwort. Hatte ich schon ausprobiert.
Trotzdem wird der Label nicht verändert, so als ob der Button-Druck gar nicht abgefangen würde.
Bist du sicher? Das würde mich doch sehr wundern. Bei mir klappt das einwandfrei.

Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: ButtonPanel: Ok-Button abfangen

Beitrag von Eb »

bei mir tritt das auch auf (WinXP, Laz 09.28,fpc 2.2.4).

neue Anwendung,
TButtonControl drauf,
label drauf

folgender Code:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ButtonPanel, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    ButtonPanel1: TButtonPanel;
    Label1: TLabel;
    procedure OKButtonClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
 
implementation
 
{ TForm1 }
 
procedure TForm1.OKButtonClick(Sender: TObject);
begin
    Label1.Caption:= 'Text';
end;
 
initialization
  {$I unit1.lrs}
 
end.
Klick auf OK ändert das label nicht.

Eb

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

Re: ButtonPanel: Ok-Button abfangen

Beitrag von theo »

Ich sagte aber, man soll die Auswertung in Form.OnCloseQuery machen, nicht in Button.OnClick

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)

Re: ButtonPanel: Ok-Button abfangen

Beitrag von pluto »

@Eb Möchtest du damit sagen, dass das OnClick Event vom TButtonPanel nicht ausgelöst wird?
MFG
Michael Springwald

Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: ButtonPanel: Ok-Button abfangen

Beitrag von Eb »

Genau das wollte ich sagen.

Im onclosequery kann man zwar etwas vor dem schliessen tun - da weiss man allerdings nicht, welcher button das schliessen initiiert hat.
Genau das möchte er aber machen, da er nur beim OK-Button was prüfen will, beim Cancel-Button aber nicht.

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

Re: ButtonPanel: Ok-Button abfangen

Beitrag von theo »

Bei mir geht das übrigens auch in OKButtonClick

Lazarus 0.9.31 r29548M FPC 2.4.2 i386-linux-gtk 2

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)

Re: ButtonPanel: Ok-Button abfangen

Beitrag von pluto »

Warum nicht einfach so:
Wenn ich auf ein Button im Form Klicke wird die Tag Eigenschaft gesetzt vom From:
Tag:=(Sender as TButton).Tag

Wenn das From aufgerufen wird musst du das tag wieder auf 0 setzten. Der OK Button könnte im Tag 1 stehen haben und der Abbrechen Button 2.
Nach dem setzten könntest du noch ein Close ausführen.

Nun rufst du das ganze so auf:
Form2.ShowModal; // Damit in Form1 nicht weiter gearbeitet wird
Anschließend kannst du mit Form2.Tag = 1 prüfen ob OK gedrückt.

So mache ich das immer.
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: ButtonPanel: Ok-Button abfangen

Beitrag von Socke »

Eb hat geschrieben:welcher button das schliessen initiiert hat.
Wenn jeder Button ein eindeutiges ModalResult hat, schon.
pluto hat geschrieben:Tag:=(Sender as TButton).Tag

Wenn das From aufgerufen wird musst du das tag wieder auf 0 setzten. Der OK Button könnte im Tag 1 stehen haben und der Abbrechen Button 2.
Nach dem setzten könntest du noch ein Close ausführen.
Warum so kompliziert? Für so etwas gibt es doch ShowModal und ModalResult.
Die Vorgehensweise:
  • Formular erstellen, Button platzieren
  • Button.ModalResult einen Wert zuweisen (kein OnClick oder ähnliches vergeben)
  • Standard-Button einstellen (TButton.Default), für den Fall, dass der Dialog nicht über einen Button beendet wird (Fenster-Rahmen, etc.)
  • ShowModal des Formulars aufrufen
Das Ergebnis:
  • Wird beim Aufruf von ShowModal ein Button geklickt (auch ein impliziter Klick auf den Standard-Button ist ein klick) wird Button.ModalResult in Form.ModalResult gespeichert.
  • In Form.OnCloseQuery kann Form.ModalResult ausgewertet werden.
  • Form.ShowModal verwendet Form.ModalResult als Rückgabewert. (warum schaut eigentlich niemand in den Quelltext?)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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)

Re: ButtonPanel: Ok-Button abfangen

Beitrag von pluto »

Warum so kompliziert? Für so etwas gibt es doch ShowModal und ModalResult.
Ich weiß, aber ich war damit nicht richtig Zufrieden. Ich meine das hatte auch Probleme, frag mich aber nicht welche. Meine Lösung geht immer und ist recht einfach. Aber wen das mit ModalResult geht ist das natürlich Prima.
MFG
Michael Springwald

Antworten