![]() |
Komponenten in eigenen Funktionen verwenden
Hallo an alle,
ich hoffe bin im richtigen Bereich und kann die Frage gut formulieren. Es geht um vollgendes. Ich habe ein Formular mit versch, Komponenten z.B Label oder eine ProgressBar und habe außerdem eine selbst geschriebene Funktion. In der Funktion möchte ich einmal sagen ProgressBar.Position:=ProgressBar.Position+1 ABER er kennt dann das Objekt nicht also die Progressbar. Ich kann die Objekte immer nur benutzen bei Ereignissen wie Button1.Click aber nie bei funktionen, die ich geschrieben habe. Wie bekomme ich Zugriff auf die Komponenten der Form. Form1.ProgressBar.... geht auch nicht. Einzige Lösung war, dass ich einen neuen Funktionsparameter erstellt habe vom Typ ProgressBar und das Objekt so zusagen übergeben habe. Aber ich kann ja nicht immer bei Benutzung eines Objektes gleich den Funktionskopf und alle aufrufe der Funktion ändern. Habt ihr ne Idee zur Lösung? Vielleicht isses ganz einfach :-D BBJ |
AW: Komponenten in eigenen Funktionen verwenden
Poste mal Code, ich glaub aber einfach, dass deine Funktion keine Methode des Formulars ist, darum stimmt der Namespace nicht und deine Funktion "sieht" die Progressbar dadurch einfach nicht.
|
AW: Komponenten in eigenen Funktionen verwenden
Schreib die Methode doch unter private oder public PArt der TForm1, dann kennt diese auch die internen Klassenvariablen.
|
AW: Komponenten in eigenen Funktionen verwenden
Oder stelle den Namen der Instanz der Komponente voran:
Delphi-Quellcode:
Wobei das ein schlechter Stil wäre ( und auch gewisse Gefahren birgt, da man immer auf eine bestimmte Instanz zugreift)
Form1.Label1.Text := 'Bl Bla Bla';
|
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
|
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
|
AW: Komponenten in eigenen Funktionen verwenden
Unbestritten. Sollte das aus meiner Antwort nicht klar ersichtlich gewesen sein
|
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
|
AW: Komponenten in eigenen Funktionen verwenden
Wenn man streng MVC anwendet gehört keine GL in die Oberfläche. Aber auch dann sollte man bestimmte Instanzen ansprechen und dann sollte man auch Klassen verwenden und die Instanzen als Parameter verwenden
|
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
|
AW: Komponenten in eigenen Funktionen verwenden
Danke für die vielen schnellen Antworten :o
Zitat:
Delphi-Quellcode:
Und im Implementationsbereich dann
public
function ReadLog(Logname,searchstr :String;Liste:Tlistbox;HTTPrs:TidHTTP):String; { Public-Deklarationen } end;
Delphi-Quellcode:
Beim compilieren kommt dann aber ein Fehler für den oublic-Bereich
function ReadLog(Logname,searchstr :String;Liste:Tlistbox;HTTPrs:TidHTTP): String;
var A,B:string; checker:integer; begin Assignfile(fileo,Folder+Logname); [...] end; [DCC Fehler] Unit1.pas(68): E2065 Ungenügende Forward- oder External-Deklaration: 'TLogFinderForm.ReadLog' Zitat:
Zitat:
|
AW: Komponenten in eigenen Funktionen verwenden
Unter Implementation dann den Namen der Formularklasse voranstellen
Delphi-Quellcode:
function TForm1.ReadLog(Logname,searchstr :String;Liste:Tlistbox;HTTPrs:TidHTTP): String;
var ... |
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
Bei 8 zu übergebenden Komponenten ist dieser Ansatz fehl am Platz. Die Funktion ist vermutlich dann auch nur noch an dieser einen stelle verwenbar. "Modularisierung" mit Funktionen ist hire unpassend. |
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
1. Dein Vorschlag den Namen vorne dran zuschreiben:
Delphi-Quellcode:
Wenn ich den Aufruf der Funktion dann durch
function TLogFinderForm.ReadLog(Logname,searchstr :String;Liste:Tlistbox;HTTPrs:TidHTTP): String;
var A,B:string; checker:integer; begin [...] end;
Delphi-Quellcode:
tätige bekomme ich den Fehler:
ReadLog(SR.Name,Filter,LogBox,HTTPrs);
[DCC Fehler] Unit1.pas(167): E2003 Undeklarierter Bezeichner: 'ReadLog' Habe dann auch beim Aufruf den Namen der Formularklassen davor geschrieben. Sieht so aus, Funktionsaufruf:
Delphi-Quellcode:
Folgender Fehler kommt dann beim Compiler..
TLogFinderForm.ReadLog(SR.Name,Filter,LogBox,HTTPrs);
[DCC Fehler] Unit1.pas(167): E2076 Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt Da wusste ich dann nicht weiter, hatte Delphi leider nur im Abi und das nicht zu umfangreich..versuchs mir neben anderen Sprachen wieder etwas beizubringen also nicht böse sein :-D |
AW: Komponenten in eigenen Funktionen verwenden
Beim Aufruf natürlich weglassen
|
AW: Komponenten in eigenen Funktionen verwenden
Um die ganzen "Fachbegriffe" noch einmal zu erklären: wenn es sich um eine nützliche allgemein verwendbare Funktion handeln soll, kann man diese modularisieren (dh. in ein eigenständiges Modul, z.B. eine Unit auslagern). Das könnte so aussehen (sinnfreier Code):
Delphi-Quellcode:
Dieser Prozedur könnte man nun 2 Zahlen und alle möglichen Nachfahren von TStrings (TListBox.Items, TComboBox.Items, TStringlist etc.) übergeben. Ist die Routine aber so speziell, dass sie nur in einem bestimmten Formular Sinn macht, sollte man sie als Methode deklarieren und hat dann Zugriff auf alle anderen Methoden und Eigenschaften des Formulars.
procedure ListNumbers(MinNumber, MaxNumber: integer; List: TStrings);
var i: integer; begin if Assigned(List) then begin List.BeginUpdate; try List.Clear; for i := MinNumber to MaxNumber do List.Add(IntToStr(i)); finally List.EndUpdate; end; end; end;
Delphi-Quellcode:
type
TDeinForm = class(TForm) ... private procedure Wuppdi; ... end; ... implementation ... procedure TDeinForm.Wuppdi; //nicht den Klassennamen vergessen, es ist ja eine Methode der Klasse begin //Code end; |
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
->[DCC Fehler] Unit1.pas(167): E2003 Undeklarierter Bezeichner: 'ReadLog' Wie bekomme ich dann den Fehler weg? |
AW: Komponenten in eigenen Funktionen verwenden
Von wo rufst du es den auf?
|
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
In einer anderen Funktion, die nicht in public steht weil diese nur was berechnet rufe ich die andere Funktion auf. Erst kommt: TLogFinderForm.ReadLog Und unter der Funktion dann eine andere in welcher die obere aufgerufen werden soll |
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
|
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
Also pure Variablen. LogBox ist ein Objekt (ne Listbox) und HTTPrs ist ne TIdHTTP Komponente. Parameter stimmen alle eigentlich. Wenn ich herausgefunden hab wies wirklich geht schreib ichs hier hin. Entweder formuliere ich die Fragen falsch oder für alle hier ist das Problem soo klein, dass versucht wird anderweitige eventuelle Probleme zu lösen^^ |
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
Ein Beispiel aus dem Leben: Das Aufklapp-Poster aus der Playboy ist eine Klasse. Da ist alles beschrieben ... aber man kann damit noch nicht so richtig was anfangen. Wenn du das Mädel aber neben dir sitzen hast, das ist dann die Instanz und damit geht dann schon was :mrgreen: ok, jetzt mal auf delpisch:
Delphi-Quellcode:
BTW:
var MeineInstanz : TLogFinderForm;
begin MeineInstanz := TLogFinderForm.Create( nil ); // Eine Instanz erzeugen try MeineInstanz.ReadLog( SR.Name, Filter, LogBox, HTTPrs ); finally MeineInstanz.Free; // Instanz wieder freigeben end; end; Wenn du einen Klasse definierst oder erweiterst, dann solltest du mal CodeCompletion versuchen (Shift-Strg-C) Du schreibst einfach
Delphi-Quellcode:
dann CodeCompletion (Shift-Strg-C) und es passiert folgendes
type
TMeineKlasse = class procedure TuWas; end;
Delphi-Quellcode:
wird automatisch hinzugefügt und du kannst dort deinen Code reinschreiben
procedure TMeineKlasse.TuWas;
begin end; |
AW: Komponenten in eigenen Funktionen verwenden
Danke für das Beispiel und Erklärung aber ich weiß schon was Klassen, Objekte und Instanzen sind, so von C++ her zumindest.
Hatte nur gehofft weil ide IDE's immer höher-entwickelter werden und selbstständiger, dass man durch wenig Code zum Ziel kommen kann. Durch ein Schlüsselwort oder so gleich zum Ziel kommen, aber dann werd ichs wohl so machen müssen. Falls ich doch noch einen kürzeren Weg finde poste ich den sicherlich :) |
AW: Komponenten in eigenen Funktionen verwenden
Zitat:
Da von jeder Klasse n Instanzen möglich sind, muss ich - wegen der zwingend notwendigen Eindeutigkeit - die Instanz angeben, auf die ich mich beziehe. Wenn du zu Hause bist und mal rufst "Wo ist meine Mutter?" wirst du eine mehr oder weniger zufrieden stellende Antwort bekommen. (Eindeutigkeit für die Hausbewohner ist gewährleistet, da sie deine Mutter kennen) Jetzt geh mal mitten in die Stadt und ruf da das gleiche. Neben vielen mitleidigen wirst du auch ratlose Blicke bekommen aber keine vernünftige Antwort, da niemandem klar ist, welche Instanz du denn meinst. Ist also wie im real life ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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