Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Klassenmethoden (https://www.delphipraxis.net/15605-problem-mit-klassenmethoden.html)

billi 1. Feb 2004 12:51


Problem mit Klassenmethoden
 
Hallo,
ich habe eine Unit Fmain. In die wird ein Frame FLayout eingefügt. Damit ich in Fmain eine Methode aus FLayout benutzen kann, muss ich diese Methode alss Klassenmethode definieren, sonst bekomme ich eine entspechende Fehlermedung.
Soweit so gut:
Code:
type
  TLayout = class(TFrame)
    class procedure LayoutLoad(name: string);
  end;
Code:
class procedure TLayout.LayoutLoad;
var
  farbe, R, G, B: string;
begin
  farbe := TEdit(FindComponent('E' + name)).text; // Hier Fehler
  R := copy(farbe, 2, 2);
  G := copy(farbe, 4, 2);
  B := copy(farbe, 6, 2);
  TShape(FindComponent('S' + name)).Brush.Color := StringToColor('$00' + B + G + R); // Hier Fehler
end;
Jetzt bekomme ich aber die selbe Fehlermeldung wie anfangs in Fmain in FLayout:
Zitat:

Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt
Und zwar in den oben kommentierten Zeilen.
Wie soll ich da vorgehen?
Schon mal vielen Dank,
Billi

mirage228 1. Feb 2004 12:55

Re: Problem mit Klassenmethoden
 
Worauf wendest du denn das "FindComponent" an? (Also FindComponent im Form, Frame oder wo?)

mfG
mirage228

billi 1. Feb 2004 13:00

Re: Problem mit Klassenmethoden
 
das wirds sein im Frame...
Aber "TLayout.FindComponent" ist falsch...

Edit:

also, ich "include" den Frame ja in Fmain, suche ich nun mit TLayout.FindComponent compilliert delphi meine unit gar nicht. suche ich aber mit Fmain.FindComponent bekomme ich beim ausführen eine Fehlermeldung.
aufrufen tu ich die methode mit:
Code:
        TLayout.LayoutLoad('gb');
gruß
billi

billi 1. Feb 2004 17:50

Re: Problem mit Klassenmethoden
 
Liste der Anhänge anzeigen (Anzahl: 2)
also, momentan blicke ich einfach nicht mehr durch...
ich bin mal so frei und hänge die Problemfälle an. Die als Kommentarblöcke auskommentierten Code Abschnitte sind die die mir die Probleme bereiten.
Wär echt nett, wenn mir da jemand helfen könnte...
gruß
billi

teebee 2. Feb 2004 09:00

Re: Problem mit Klassenmethoden
 
Warum greifst Du überhaupt mit Klassenmethoden auf das Frame zu?
Zitat:

Zitat von billi
Delphi-Quellcode:
     begin
        DialogSeite := TLayout.Create(nil);
        with DialogSeite do begin
         parent := Fmain;
         Left := 145;
         Top := 0;
         TabOrder := 1;
        end;
// ab hier finde ich es sehr 'seltsam':
        TLayout(self).BilderGesamt;
{        TLayout.LayoutLoad('gb');
        TLayout.LayoutLoad('font');
        TLayout.LayoutLoad('link');
        TLayout.LayoutLoad('alink');
        TLayout.LayoutLoad('vlink');
 }     end;

Du hast doch schon Dein Objekt 'DialogSeite'. Was spricht gegen
Delphi-Quellcode:
        (DialogSeite As TLayout).BilderGesamt;
        (DialogSeite As TLayout).LayoutLoad('gb');
        (DialogSeite As TLayout).LayoutLoad('font');
        (DialogSeite As TLayout).LayoutLoad('link');
        (DialogSeite As TLayout).LayoutLoad('alink');
        (DialogSeite As TLayout).LayoutLoad('vlink');
?
Dann brauchst Du auch keine Klassenmethoden. Die sind hier eigentlich sowieso fehl am Platz.

Gruß, teebee

billi 2. Feb 2004 13:29

Re: Problem mit Klassenmethoden
 
auf die Idee mit Klassenmethoden bin ich dank der Fehlermeldnug gekommen... :evil:
eigendlich funzt auch alles, aber das hier geht immer noch nicht:
Code:
procedure TLayout.LayoutLoad;
var
  farbe, R, G, B: string;
begin
  farbe := TEdit(FindComponent('TLayout.E' + name)).text;
  R := copy(farbe, 2, 2);
  G := copy(farbe, 4, 2);
  B := copy(farbe, 6, 2);
  TShape(FindComponent('TLayout.S' + name)).Brush.Color := StringToColor('$00' + B + G + R);
end;
ebenso das:
Code:
procedure TLayout.LayoutLoad;
var
  farbe, R, G, B: string;
begin
  farbe := TEdit(TLayout(self).FindComponent('E' + name)).text;
  R := copy(farbe, 2, 2);
  G := copy(farbe, 4, 2);
  B := copy(farbe, 6, 2);
  TShape(TLayout(self).FindComponent('S' + name)).Brush.Color := StringToColor('$00' + B + G + R);
end;
und das:
Code:
procedure TLayout.LayoutLoad;
var
  farbe, R, G, B: string;
begin
  farbe := TEdit(FindComponent('TLayout(self).E' + name)).text;
  R := copy(farbe, 2, 2);
  G := copy(farbe, 4, 2);
  B := copy(farbe, 6, 2);
  TShape(FindComponent('TLayout(self).S' + name)).Brush.Color := StringToColor('$00' + B + G + R);
end;
Das liegt wohl daran, wo ich suche...

[edit]
kannst du mir das mal erklären, bin noch nicht soo der superheld in delphi :wink: (DialogSeite As TLayout)
[/edit]

teebee 2. Feb 2004 14:15

Re: Problem mit Klassenmethoden
 
Zitat:

Zitat von billi
kannst du mir das mal erklären, bin noch nicht soo der superheld in delphi :wink: (DialogSeite As TLayout)

Du deklarierst DialogSeite als TFrame. TFrame bringt aber von Hause aus keine Methoden LayoutLoad etc. mit. D.h der Compiler weiss an dieser Stelle nicht, welche Methode er aufrufen soll.
Delphi-Quellcode:
DialogSeite.LayoutLoad;
brächte den Compilerfehler 'Undefinerter Bezeichner'. Entweder deklarierst Du DialogSeite als TLayout, was unpraktisch wäre, weil Du verschiedene Frames brauchst, oder Du castest DialogSeite auf den Typ, den Du gerade brauchst. Genau das macht der as-Operator. Er sagt dem Compiler, dass er DialogSeite nicht als TFrame sondern als TLayout betrachten soll, denn TLayout beinhaltet die gewünschte Methode. Für den Fall, dass DialogSeite irgendetwas anderes ist als ein Abkömmling von TFrame, kriegst Du einen Exception.

Der Vollständigkeit halber: Du kannst auch ohne den as-Operator casten, das sähe dann so aus:
Delphi-Quellcode:
TLayout(DialogSeite).LayoutLoad;
Hat den Vorteil, dass es ein kleines bisschen flotter ist, weil die Typüberprüfung nicht gemacht wird, aber den Nachteil, dass Du, wenn Du DialogSeite keine Methode LayoutLoad haben sollte (z.B. weil durch einen Programierfehler nicht vom Typ TLayout) der Aufruf ins Nirvana geht. Wenn man weiss, was man tut, ist diese Möglichkeit aber auch völlig ok.

Ich sehe gerade, dass Du von der zweiten Möglichkeit schon ausgiebig Gebrauch machst. :wink:

Probier mal folgendes:
Delphi-Quellcode:
farbe := TEdit(FindComponent('E' + name)).text;
Bist Du sicher, dass 'E'+name etwas sinnvolles ergibt? Wird name richtig gesetzt?

Gruß, teebee

billi 2. Feb 2004 14:25

Re: Problem mit Klassenmethoden
 
:wall: :wall: :wall: :wall: man sollte beim methodenaufruf "name" schon richtig vergebn... dnake für den tipp. Manchmal übersieht man echt das offensichtlichste...
gruß und vielen Dank,
billi

Touchdown 2. Feb 2004 14:34

Re: Problem mit Klassenmethoden
 
Class procedures gehören direkt zu einer Klasse, nicht wie üblich zu einer Instanz einer Klasse.

Sehr wichtiger und entscheidender Unterschied!!! :warn:

billi 5. Feb 2004 19:51

Re: Problem mit Klassenmethoden
 
so, ich bekomme das nicht so wirklich gebacken...
in den oben beschriebenen Fällen klapp alles wunderbar, aber irgendwie hab ich jetzt z.B. problem von einem, über einen butten auf TQuellen, aufgerufenen Formular aus ein editfeld auf TQuellen zu "edititieren"...
Was ich bräuchte wär mal ne Erklärung wie man solche "Verzeweigungen" zwischen Units, Methoden, Formularen, Frames, Elementen (Editfelder u.ä.) RICHTIG macht/verwendet.
Es ist halt so, dass ich mir delphi an konkreten PRojekten erarbeite, aber nun in der Klemme stecke und mein LEhrer in der Schule kann mir net helfen, ich bin nach einem halben Jahr und ca. 10 Programmen besser als er, nur fehlen da machmal Grundlagen (wie in diesem Fall?!). :(
Und auf solche Sachen kommt man im UNterricht eh net in einem JAhr...
gruß
billi


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz