![]() |
OOP / Methodenbezeichner: Anfängerfrage
Hallo & pardon schon im voraus für diese Anfängerfrage,
ich habe ein Problem von dem ich ausgehe, dass es relativ einfach gelöst werden könnte. Meine Google/-Forensuchergebnisse führten leider zu keinem Ergebnis. Also ... Der Code hier soll nur dazu dienen meine Frage zu verdeutlichen, ist also nur ein Beispiel:
Delphi-Quellcode:
Ich packe diese Prozedur nun also in den implementations-Teil und würde sie gern weiter verwenden, dies geht jedoch nicht, weil ich dann die Fehlermeldung erhalte, dass Label1 ein 'undefinierter Bezeichner' sei.
procedure LabelRefresh;
begin Label1.Caption := IntToStr(wert); end; Gut, der Fehler muss also irgendwo darin legen, dass nicht angegeben ist, dass Label1 zu TForm1 gehört ... Was dazu führte, dass ich den Code folgendermaßen modifizierte:
Delphi-Quellcode:
Funktionierte leider nicht wie erhofft, denn nun kommt der Fehler: 'Methodenbezeichner erwartet' ... Hm, mal fix in der Hilfe nachgesehen und ermittelt, dass man dieses Problem mit dem Bezeichner 'Self' beheben kann, was jedoch leider auch nicht funktioniert, weil 'Self (also konkret TForm1(Self).Label1.Caption) ebenso als undefinierter Bezeichner gewertet wird (fehlt da vlt. ein Eintrag bei den 'uses'?).
procedure LabelRefresh;
begin TForm1.Label1.Caption := IntToStr(wert); end; Naja, ich denke mal, dass Problem lässt sich einfach beheben, ist wahrscheinlich nur ein kleiner Zusatz ... Aber ich komm einfach nicht drauf. Danke bereits für's Lesen! [edit=sakura] [Klammern ersetzen] Mfg, sakura[/edit] |
Re: [OOP / Methodenbezeichner] Anfängerfrage
Delphi-Quellcode:
Das T vorm Form1.Label1.Caption muss weg ;)
procedure LabelRefresh;
begin Form1.Label1.Caption := IntToStr(wert); end; |
Re: [OOP / Methodenbezeichner] Anfängerfrage
Das Problem mit "Self" umgehst Du, in dem Du
Delphi-Quellcode:
löscht.
Var
Form1: TForm1; Das ist aber Geschmackssache. Gruß Igotcha |
Re: [OOP / Methodenbezeichner] Anfängerfrage
Hui! Erstens vielen Dank für die schnellen Antworten und zweitens vielen Dank für die Lösungsansätze! Die Sache mit dem 'Self' ist etwas das ich auch für spätere Dinge im Hinterkopf behalten kann! :)
|
Re: [OOP / Methodenbezeichner] Anfängerfrage
Das gesammte problem tritt eigentlich nur auf, weil du deine procedure als normale globale prozedur deklarierst und nicht als methode einer speziellen klasse. Generell handelt man sich nur ärger ein, wenn man von globalen punkten lokale aufgaben direkt ausführt. Ich würd das als methode von TForm1 deklarieren, womit dnn auch self wieder verfügbar ist.
|
Re: [OOP / Methodenbezeichner] Anfängerfrage
Ich kann mich Maximov nur anschliessen. Die Verwendung der globalen Form1-Variable ist eh das schlimmste was man machen kann. Wenn du ploetzlich Form2 als MainForm deklarierst, und dir darin eine Neue Instanz von TForm1 deklarierst, dann wirds krachen weil Form1 nicht unbedingt verfuegbar ist. Tipp: keine globalen Prozeduren Verwenden, Forms nicht automatisch erstellen lassen (kann in den Projektoptionen eingestellt werden), und die unit-globalen Form-Variablen (Form1: TForm1;) loeschen.
Greetz alcaeus |
Re: [OOP / Methodenbezeichner] Anfängerfrage
Als Alternative kannst Du an deine Procedure auch einfach das TLabel übergeben um welches es geht.
Delphi-Quellcode:
procedure LabelRefresh (aLabel : TLabel; value : Integer);
begin aLabel.Caption := IntToStr (value); end; procedure TForm1.Button1Click(Sender: TObject); begin LabelRefresh(Label1,10); end; |
Re: [OOP / Methodenbezeichner] Anfängerfrage
Zitat:
Spezielle Klasse? Klaro! :) Methode vom Form? hmmm... Schlecht bis gar nicht wiederverwendbar. ;) Im Vorfeld würde ich ![]() OK... Im Menu unter View findest du den Project Manager. Öffne ihn mal und füge deiner Projektgruppe ein neues Projekt hinzu. Es sollte ein Package sein. ;) Speichere es am Besten gleich als "LabelMitWertDings.dpk" ab. Dem Package verpasst du eine neue Unit und speicherst diese als "uLabelMitWertDings.pas". Wie man vielleicht sehen kann, wird das ene Ableitung von TLabel. Wir wollen also die alte Eigenschaft Caption verstecken und eine neue Eigenschaft vom Typ Integer einführen. Diese sollte dann hinter den Kulissen die Umwandlung Integer -> String durchführen um die Caption des Labels zu besetzen. Außerdem sollten wir die Caption direkt im Constructor mit einer Zahl besetzen (sonst knallt es ja gleich von Anfang an :zwinker: ) Noch ein Register, um das Control in die IDE zu kriegen und das war's dann auch schon. :) Los Unitos:
Delphi-Quellcode:
Jetzt einfach im Project Manager einen Rechtsklick auf das Package und Install anklicken ->und *fump* schon ist das Control in der Komponentenpalette. (Wie im Code ersichtlich unter Samples)
unit uLabelMitWertDings;
interface uses Classes, StdCtrls; type TLabelMitWertDings = class(TLabel) private fWertDings :Integer; protected property Caption; procedure setWertDings(const aValue: Integer);virtual; published property WertDings :Integer read fWertDings write setWertDings; public constructor Create(aOwner: TComponent); override; end; procedure Register(); // zum Installieren in die IDE implementation uses SysUtils; procedure Register(); begin RegisterComponents('Samples', [TLabelMitWertDings]); end; { TLabelMitWertDings } constructor TLabelMitWertDings.Create(aOwner: TComponent); begin inherited Create(aOwner); WertDings := 0; end; procedure TLabelMitWertDings.setWertDings(const aValue: Integer); begin fWertDings := aValue; inherited Caption := IntToStr(fWertDings); end; end. Alles witere dürfte klar sein:
Delphi-Quellcode:
Und zu den Tips mit den globalen Variablen des Formdesigners: Das kann doch nicht wirklich euer ernst sein? :shock:
LabelMitWertDings.WertDings := 1;
Ich habe keine Ahnung warum Borland diesen Mist gebaut hat. Aber wer diese DAU-Krücken benutzt hat soviel Sinn für OOP bzw. wartbaren, fehlerresistenten Code wie meine Großmutter. (Eher noch weniger :roll: ) |
Re: [OOP / Methodenbezeichner] Anfängerfrage
@Robert_G: Ja, das ist mal wieder ein schöner rundumschlag :mrgreen: Am besten Tso verwendet gleich Interfaces, um diese konkrete aufgabe zu generalisieren und von der implementierung zu entkoppeln :wink:
@Tso: Willkommen in der Praxis :dp: ...und lass dich von uns OOP-lobbyisten nicht ins boxhorn jagen :cyclops: |
Re: [OOP / Methodenbezeichner] Anfängerfrage
Hallo Robert_G
toller Beitrag. Nur leider völlig am Thema vorbei :cyclops: . Tso's Problem ist, dass sie/er eine Komponente die sie/er auf ein Form gesetzt hat innerhalb einer globalen procedure aufrufen möchte. Das Problem ist mit einem erweiterten TLabel Nachfahren auch nicht gelöst (Es sei denn, man bastelt sich ein globale Instanz und erzeugt das Object im initialization Abschnitt - aber das wollen ganz bestimmt nicht machen :stupid: ). Ich halte maximov's Vorschlag keine globalen Methoden zu verwenden für den Besten. Hinwies: Du versteckst die published Caption property im protected Abschnitt :shock: wie unsauber. Außerdem funktioniert das gar nicht unter Delphi. Dort gilt: Einmal published immer published. Egal was der Nachfahre macht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz