Eine OnClick-Prozedur für versch. Edit-Felder

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
TomTom
Beiträge: 4
Registriert: Mi 14. Sep 2011, 19:43

Eine OnClick-Prozedur für versch. Edit-Felder

Beitrag von TomTom »

Hallo.
Da ich noch blutiger Anfänger bin, würde ich mich über Hilfen sehr freuen.
Also: Ich habe angefangen einen Rechner für geometrische Körper zu programmieren (muss ich für die Schule fertigstellen). Die Eingabe, Verarbeitung und Ausgabe klappt gut. Doch ich möchte, dass der Text, der in den Editfeldern steht, verschwinden, wenn es sich um einen bestimmten String handelt.
Ich habe es bisher so umgesetzt (für jedes Feld so eine Prozedur):

Code: Alles auswählen

procedure TForm1.EingabeRadiusClick(Sender: TObject);
begin
  if EingabeRadius.Text = 'Radius' then
    EingabeRadius.Text := '';
end;
Ich habe mich gefragt, ob es nicht eine Möglichkeit gibt, eine Prozedur zu schreiben, und sie bei mehreren Eingabefeldern anzuwenden.
Das Problem ist, dass die Felder auf verschiedene Strings reagieren sollen. Das heißt, dass z.B. EingabefeldX auf 'Umfang' oder ähnliches reagieren soll.
Ich hoffe die Situation ist genau genug beschrieben.

PS.: falls in dem Code irgendwelche anderen Fehler sind, oder ihr generelle Anmerkungen im Bezug auf Namen, Einrückung oder anderes habt, dann wäre ich froh auch das zu hören.

Mit freundlichen Grüßen, Tom.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Eine OnClick-Prozedur für versch. Edit-Felder

Beitrag von MAC »

Hallo & Willkommen im Lazarusforum.

Ich verstehe was du willst, umsetzbar ist das auf jeden Fall.
Die Frage ist ob es Sinn ergibt, da die beste möglichekeit wäre eine neue Klasse zu erstellen (von mit aus TMeinEdit) und diese von TEdit abzuleiten und dann so bearbeiten das diese sich sozusagen automatisch darum kümmert...
Problem bei der Sache das es schwer zu verstehen ist wenn man Anfänger ist...

Nicht ganz 100% optimal (aber immer noch besser als für jedes Edit eine eigene Funktion) müsste das sein:

Code: Alles auswählen

procedure TForm1.Edit1Click(Sender: TObject);
var
 vergleichtext:string;
begin
vergleichtext := ''; // erstmal vergleichtext leer machen.
if Sender = Edit1 then vergleichtext := 'Radius';
if Sender = Edit2 then vergleichtext := 'Umfang';
if Sender = Edit3 then vergleichtext := 'Höhe';
// wenn vergleichtext nicht mehr leer ist:
if vergleichtext <> '' then
  begin
  if (Sender as TEdit).Text = vergleichtext then (Sender as TEdit).Text := '';
  end;
Wenn du die Zeile mit (Sender as TEdit) nicht verstehst:
Sender ist ein Parameter der Prozedure (viele Prozedure besitzt den Parameter Sender:TObject...).
Mit dem wird übergeben Welches Objekt das Ereignis ausgelöst hat.
Du kannst jetzt im Objektinstpektor bei deinen 3 Edits diese Prozedur angeben und wenn sie über Edit1 ausgelöst wird hat Sender den Wert Edit1...

Sender as TEdit sagt das die Variable Sender, welche vom typ TObject ist als TEdit behandelt werden soll. Das ist in diesem Fall nicht weiter schlimm, da es sich hier um Objektorientierte programmierung handelt, sprich TObject ist Vorfahre von TEdit oder anders ausgedrückt: Alles was ein TObject kann, kann ein TEdit schon lange :)
Denn nur ein TEdit besitzt ein Text...

Code: Alles auswählen

Signatur := nil;

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Eine OnClick-Prozedur für versch. Edit-Felder

Beitrag von DiBo33 »

Erstelle ein Array mit den Vergleichstexten und gebe den Editfelder als Tag den Index des Arrays

Code: Alles auswählen

procedure TForm1.EditClick(Sender: TObject);
const
    vergleichstxt = array[1..3] of string = ('Radius', 'Umfang', 'Höhe');
var
    vergleich: integer;
begin
    vergleich := TEdit(Sender).Tag;
    if (vergleich > 0) and (vergleich <= high(vergleichstxt)) then
    begin
        if (vergleichstxt[vergleich] = TEdit(Sender).Text) then TEdit(Sender).Text = '';
    end;
end;

TomTom
Beiträge: 4
Registriert: Mi 14. Sep 2011, 19:43

Re: Eine OnClick-Prozedur für versch. Edit-Felder

Beitrag von TomTom »

Danke für die super Antworten, MAC und DiBo!
Klappt beides super.

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Eine OnClick-Prozedur für versch. Edit-Felder

Beitrag von Bora4d »

Du hast schon dein Antwort aber was ich mir Frage ist warum machst du den if-Abfrage wenn du den Text löschst?
Du kannst doch den Text einfach löschen und alle entsprechenden Edits auf gleiche OnClick-Ereignis setzten. Das OnClick-Ereignis wird dann nur für diese Edits verwendet. So ist doch einfacher:

Code: Alles auswählen

procedure TForm1.EingabeRadiusClick(Sender: TObject);
begin
   TEdit(Sender).Text := '';
end;

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Eine OnClick-Prozedur für versch. Edit-Felder

Beitrag von MAC »

Hast du Firefox Bora4d ?
Wenn ja schau mal rechts oben auf deine Suchleiste wo (standartmäßig) "google" in einer grauen Schrift steht
Wenn man das jetzt anklickt verschwindet der Text.
Schreibt man jetzt seine Suche rein wie zum beispiel "Test"
und klickt dann nochmal drauf verschwindet der Text nicht...

Deshalb die If abfrage, weil der Text nur gelöscht werden soll wenn vorher "Radius" (oder hier "google" ) stand...

Code: Alles auswählen

Signatur := nil;

Antworten