100 Routinen sind zu viel

  • 1
  • 2
  • Page 1 of 2
Stefan
Schreiberling
Avatar
Gender: n/a
Location: Bremerhaven
Posts: 640
Registered: 04 / 2002
Subject:

100 Routinen sind zu viel

 · 
Posted: 28.05.2006 - 19:08  ·  #1
Hallo,

nun ist es soweit und ich möchte die Delphi Profis mit einigen banalen Fragen behelligen :roll:

Also ich möchte eine rel. große Anzahl von Werten eingeben können. Dazu wollte ich Edit-Felder verwenden, es würden aber so ca. 100 Edit-Felder werden. Demnach müsste ich auch ca. 100 Ereignisroutinen haben, um zumindest eine gültige Eingabe zu prüfen (nur Zahlen im Bereich 0..255 oder 0..23). Das wird natürlich rel. unübesichtlich, da die Routinen aber fast alle das gleiche machen sollen müsste es doch eine Möglichkeit geben die Anzahl zu reduzieren. Ich habe zwar einen riesen Haufen Bücher aber sowas findet man da leider nicht. Kann mir da jemand etwas helfen?

Danke und Gruß

Stefan
Thomas
Benutzer
Avatar
Gender:
Location: Gera
Age: 61
Posts: 123
Registered: 04 / 2003
Subject:

Re: 100 Routinen sind zu viel

 · 
Posted: 28.05.2006 - 20:37  ·  #2
Hallo Stefan,

Delphi hat nichts dagegen, wenn alle Eingabefelder die selbe Ereignissbehandlungsroutine aufrufen. Für solche Sachen wie die Validierung der Eingabe ist das überhaupt kein Problem. Nur sollen ja die eingegebenen Werte sicherlich verschiedenen Variablen zugewiesen werden. Eine Möglichkeit dafür ist die Eigenschaft "Tag" die alle visuellen Komponenten besitzen. Tag ist ein Integer und kann im Objektinspektor für jedes Editfeld zugewiesen werden. Somit kann die Ereignissbehandlungsroutine am Wert des Feldes "Tag" erkennen, welches Editfeld sie aufgerufen hat. Der Aufrufer wird ja im Parameter "Sender" der Routine übergeben. Sender ist allerdings vom Typ "TObject" und kennt die Eigenschaft "Tag" nicht. Wenn nur Editfelder diese Routine aufrufen kann man aber einen Cast machen. Etwa in dieser Art..
Code
procedure TForm1.EditExit(Sender: TObject);
begin
  case TEdit(Sender).Tag of
    1:
      Wert1 := StrToInt(TEdit(Sender).Text);
    2:
      Wert2 := StrToInt(TEdit(Sender).Text);
    3:
      Wert3 := StrToInt(TEdit(Sender).Text);
  end;
end;


Gruß

Thomas
Stefan
Schreiberling
Avatar
Gender: n/a
Location: Bremerhaven
Posts: 640
Registered: 04 / 2002
Subject:

Re: 100 Routinen sind zu viel

 · 
Posted: 29.05.2006 - 09:44  ·  #3
Hi Thomas,

vielen Dank für die Infos. Wie bzw. wodurch wird die procedure TForm1.EditExt(Sender:TObject) zur Ereignisroutine für diejenigen Edit Felder, die hier berücksichtigt werden sollen und dem Namen nach würde ich vermuten es ist das Ereignis wenn ein Edit Feld verlassen wird???

Gruß

Stefan
Stefan
Schreiberling
Avatar
Gender: n/a
Location: Bremerhaven
Posts: 640
Registered: 04 / 2002
Subject:

Re: 100 Routinen sind zu viel

 · 
Posted: 29.05.2006 - 13:46  ·  #4
Damit ja noch nicht genug (dumme) Fragen, mal so zum Verständnis für den Delphi noob. Die Methode EditExit schluckt der Compiler, genauso wie EditClick das läßt mich vermuten es gibt da noch mehr, jetzt nicht lachen aber woher bekommt man diese Informationen was (alles) so möglich ist :-? ?

Nächste Frage, TEdit(Sender).Tag. TEdit ist ja eine Klasse und Sender ist ein Übergabeparameter vom Typ (Klasse) TObject. Bedeutet TEdit(Sender)... das soetwas wie eine Typ(Klassen) Konvertierung ausgeführt wird??

Danke und Gruß

Stefan
Thomas
Benutzer
Avatar
Gender:
Location: Gera
Age: 61
Posts: 123
Registered: 04 / 2003
Subject:

Re: 100 Routinen sind zu viel

 · 
Posted: 29.05.2006 - 19:05  ·  #5
Hallo Stefan,

im Objektinspektor von Delphi hast Du zwei Tab's, "Eigenschaften" und "Ereignisse". Wenn Du auf die Seite "Ereignisse" wechselst, siehst Du
links alle Ereignisse, welche die ausgewählte(n) Komponenten besitzen. Rechts von jedem Ereignissnamen kannst Du den Namen der mit dem Ereigniss verknüpften Prozedur eintragen. Wenn diese Prozedur noch nicht existiert, legt Delphi automatisch einen Rumpf an. Du kannst aber auch eine Prozedur mit den passenden Übergabeparametern von Hand erstellen und dort eintragen oder eine bereits vorhandene Prozedur diesem Ereigniss zuordnen. In der Combobox rechts neben dem Eigenschaftsnamen werden alle von den Übergabeparametern her passenden Prozeduren angezeigt. Wann das Ereigniss ausgelöst wird und welche Parameter übergeben werden verrät die Hilfe. Einfach den Cursor im Objektinspektor in das Eingabefeld für den Prozedurnamen stellen und F1 drücken. Der Name für die Prozedur zur Ereignissbehandlung ist frei wählbar, man macht sich aber das Leben leichter, wenn man "sprechende" Namen wählt. "EditExit" ist kein gutes Beispiel, es verrät zwar, dass diese Routine beim verlassen des Feldes aufgerufen wird, aber nicht weshalb und warum, "ValidateNumInput" wäre eine bessere Idee, wenn ich prüfen will, ob eine Zahl eingegeben wurde.

Zu der Sache mit dem Cast. Alle Komponenten in Delphi sind durch ein oder mehrfache Ableitung von einem Basistyp entstanden. Eine abgeleitete Komponente erbt alle Eigenschaften und Methoden von ihrer Elternkomponente. Im Fall von TEDit sieht diese Hirarchie so aus:

Quote
TEdit -> TCustomEdit -> TWinControl -> TControl -> TComponent -> TPersistent -> TObject


Da aufgrund der Vererbung eine abgeleitete Komponente alle Eigenschaften ihrer Vorgänger besitzt, darf man einer Variablen vom Typ eines der Vorgänger auch eine davon abgeleitete Komponente zuweisen. Also kann ich einer Variblen vom Typ TObject auch ein TEdit zuweisen.
Somit hat eine Variable genaugenommen zwei Typen, den der bei ihrer Deklaration angegeben wurde und den der Komponente auf die sie real zeigt. Erster ist zur Kompilezeit bekannt und kann sich nicht ändern, der zweite ist erst zur Laufzeit des Programmes bekannt und kann sich mit jeder Zuweisung an diese Variable ändern. Der Kompiler kennt nur den deklarierten Typ und erlaubt somit auch nur den Zugriff auf Eigenschaften und Methoden die für diesen Typ existieren. Der Ausdruck
Code
TEdit(Sender)
ist die Anweisung an den Kompiler: "ich weiss, daß Sender nicht vom Typ TEdit ist, tue aber trotzdem so, als ob Sender vom Typ TEdit wäre". Damit setze ich natürlcih die Prüfungsmechanismen des Kompilers ausser Betrieb. Wenn ich die Prozedur nur als Ereignissbehandlung für TEdit's verwende. kann ich sicher sein, daß Sender immer auf ein TEdit zeigt und der Cast wird funktionieren. Die sichere Variante ist
Code
if Sender is TEdit then TEdit(Sender)...
.
Hier prüft der Operator "is" ob Sender wiklich zur Laufzeit auf ein TEdit oder eine davon abgeleitete Komponente zeigt und nur wenn ja, wird der Cast ausgeführt.

Ich hoffe, daß ich Dir etwas weiterhelfen konnte. Sehr zu empfehlen ist auch die Hife von Delphi, sie erklärt viele Sachverhalte sehr anschaulich und mit Beispielen.

P.S. Wo ich hier von Komponenten spreche, müsste es eigentlich Objekte heissen. Die Komponenten in Delphi sind nur eine spezielle Form von Objekten und die Aussagen über Zuweisungsverträglichkeit und so weiter gelten generell für alle Objekte.

Gruß Thomas
Fritz
 
Avatar
 
Subject:

Re: 100 Routinen sind zu viel

 · 
Posted: 30.05.2006 - 08:58  ·  #6
@Sefan: Glückwunsch zur schönen R12GS ! HeHe 😉


Gruss Fritz
Stefan
Schreiberling
Avatar
Gender: n/a
Location: Bremerhaven
Posts: 640
Registered: 04 / 2002
Subject:

Re: 100 Routinen sind zu viel

 · 
Posted: 30.05.2006 - 09:15  ·  #7
Hi,

@Thomas: Vielen Dank, dass hat mir sehr geholfen!!!
Ich muß noch viel lernenen :roll: Ich hoffe das ich jetzt mal etwas am Ball bleiben kann, denn ich versuche schon seit geraumer Zeit mich mit Delphi anzufreunden, nur wenn man mal was liest und probiert, dann aber Wochen und Monate nicht mehr dazu kommt das zu vertiefen kommt nichts gescheites dabei heraus :nein: 😢 ...

@Fritz: Danke, damit habe ich mir ein langjährigen Traum verwirklicht *freuwieblöd* :blob7: fährst Du auch Mopped?

Gruß

Stefan
Fritz
 
Avatar
 
Subject:

Re: 100 Routinen sind zu viel

 · 
Posted: 30.05.2006 - 10:12  ·  #8
@Stefan: Oh ja, das tue ich. R12GS schwarz. :P
  • 1
  • 2
  • Page 1 of 2
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   109   123 · Page-Gen-Time: 0.040057s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI