AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Klassenmethoden

Ein Thema von billi · begonnen am 1. Feb 2004 · letzter Beitrag vom 5. Feb 2004
Antwort Antwort
billi

Registriert seit: 11. Sep 2003
Ort: Darmstadt
127 Beiträge
 
Delphi 5 Standard
 
#1

Problem mit Klassenmethoden

  Alt 1. Feb 2004, 12:51
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
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Problem mit Klassenmethoden

  Alt 1. Feb 2004, 12:55
Worauf wendest du denn das "FindComponent" an? (Also FindComponent im Form, Frame oder wo?)

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
billi

Registriert seit: 11. Sep 2003
Ort: Darmstadt
127 Beiträge
 
Delphi 5 Standard
 
#3

Re: Problem mit Klassenmethoden

  Alt 1. Feb 2004, 13:00
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
  Mit Zitat antworten Zitat
billi

Registriert seit: 11. Sep 2003
Ort: Darmstadt
127 Beiträge
 
Delphi 5 Standard
 
#4

Re: Problem mit Klassenmethoden

  Alt 1. Feb 2004, 17:50
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
Angehängte Dateien
Dateityp: pas upiccd2.pas (3,8 KB, 2x aufgerufen)
Dateityp: pas ulayout.pas (2,8 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#5

Re: Problem mit Klassenmethoden

  Alt 2. Feb 2004, 09:00
Warum greifst Du überhaupt mit Klassenmethoden auf das Frame zu?
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
  Mit Zitat antworten Zitat
billi

Registriert seit: 11. Sep 2003
Ort: Darmstadt
127 Beiträge
 
Delphi 5 Standard
 
#6

Re: Problem mit Klassenmethoden

  Alt 2. Feb 2004, 13:29
auf die Idee mit Klassenmethoden bin ich dank der Fehlermeldnug gekommen...
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 (DialogSeite As TLayout)
[/edit]
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#7

Re: Problem mit Klassenmethoden

  Alt 2. Feb 2004, 14:15
Zitat von billi:
kannst du mir das mal erklären, bin noch nicht soo der superheld in delphi (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.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: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.

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

Gruß, teebee
  Mit Zitat antworten Zitat
billi

Registriert seit: 11. Sep 2003
Ort: Darmstadt
127 Beiträge
 
Delphi 5 Standard
 
#8

Re: Problem mit Klassenmethoden

  Alt 2. Feb 2004, 14:25
man sollte beim methodenaufruf "name" schon richtig vergebn... dnake für den tipp. Manchmal übersieht man echt das offensichtlichste...
gruß und vielen Dank,
billi
  Mit Zitat antworten Zitat
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#9

Re: Problem mit Klassenmethoden

  Alt 2. Feb 2004, 14:34
Class procedures gehören direkt zu einer Klasse, nicht wie üblich zu einer Instanz einer Klasse.

Sehr wichtiger und entscheidender Unterschied!!!
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
billi

Registriert seit: 11. Sep 2003
Ort: Darmstadt
127 Beiträge
 
Delphi 5 Standard
 
#10

Re: Problem mit Klassenmethoden

  Alt 5. Feb 2004, 19:51
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 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