Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Komponenten in eigenen Funktionen verwenden (https://www.delphipraxis.net/152270-komponenten-eigenen-funktionen-verwenden.html)

BBJ 16. Jun 2010 23:21

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

H4ndy 16. Jun 2010 23:39

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.

s.h.a.r.k 16. Jun 2010 23:40

AW: Komponenten in eigenen Funktionen verwenden
 
Schreib die Methode doch unter private oder public PArt der TForm1, dann kennt diese auch die internen Klassenvariablen.

mkinzler 17. Jun 2010 05:35

AW: Komponenten in eigenen Funktionen verwenden
 
Oder stelle den Namen der Instanz der Komponente voran:

Delphi-Quellcode:
Form1.Label1.Text := 'Bl Bla Bla';
Wobei das ein schlechter Stil wäre ( und auch gewisse Gefahren birgt, da man immer auf eine bestimmte Instanz zugreift)

Bernhard Geyer 17. Jun 2010 07:35

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Zitat von BBJ (Beitrag 1029532)
In der Funktion möchte ich einmal sagen ProgressBar.Position:=ProgressBar.Position+1

Wieso übergibst du die zu verwendente Progressbar nicht als Parameter für deine Funktion?

Luckie 17. Jun 2010 08:55

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1029544)
Zitat:

Zitat von BBJ (Beitrag 1029532)
In der Funktion möchte ich einmal sagen ProgressBar.Position:=ProgressBar.Position+1

Wieso übergibst du die zu verwendente Progressbar nicht als Parameter für deine Funktion?

Wobei eine Routine, die die Oberfläche aktualisiert zum Formular gehört und deswegen auch eine Methode der Formularklasse sein sollte, finde ich.

mkinzler 17. Jun 2010 09:00

AW: Komponenten in eigenen Funktionen verwenden
 
Unbestritten. Sollte das aus meiner Antwort nicht klar ersichtlich gewesen sein

Bernhard Geyer 17. Jun 2010 09:06

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Zitat von Luckie (Beitrag 1029562)
Wobei eine Routine, die die Oberfläche aktualisiert zum Formular gehört und deswegen auch eine Methode der Formularklasse sein sollte, finde ich.

Nicht unbedingt. Wenn die Funktion so allgemein ist wie z.B. ein CopyFile/CopyDir bei der man einfach den Kopierfortschritt sehen will ohne das fest an eine (Basisformular)-Klasse als Methode zu binden. Wenn die Logik in der Funktion so speziell ist das eh noch viel mehr Daten des Formulars benötigt werden gebe ich dir recht. Hier macht eine "modularisierung" als Funktion wenig Sinn.

mkinzler 17. Jun 2010 09:10

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

Bernhard Geyer 17. Jun 2010 09:22

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Zitat von mkinzler (Beitrag 1029570)
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

Dann warten wir mal darauf das es für das Dateisystemhandling in Delphi 201x eine File-Klasse wie in Java gibt damit wir das dort auch schön Objektorientiert machen können :-)

BBJ 17. Jun 2010 15:16

AW: Komponenten in eigenen Funktionen verwenden
 
Danke für die vielen schnellen Antworten :o
Zitat:

Zitat von s.h.a.r.k (Beitrag 1029535)
Schreib die Methode doch unter private oder public PArt der TForm1, dann kennt diese auch die internen Klassenvariablen.

->Ja sowas hatte ich schon einige Male versucht aber das ging irgendwie schief, hier mal der Code
Delphi-Quellcode:
public
    function ReadLog(Logname,searchstr :String;Liste:Tlistbox;HTTPrs:TidHTTP):String;
    { Public-Deklarationen }
end;
Und im Implementationsbereich dann

Delphi-Quellcode:
function ReadLog(Logname,searchstr :String;Liste:Tlistbox;HTTPrs:TidHTTP): String;
var
  A,B:string;
  checker:integer;
begin

  Assignfile(fileo,Folder+Logname);
[...]

end;
Beim compilieren kommt dann aber ein Fehler für den oublic-Bereich
[DCC Fehler] Unit1.pas(68): E2065 Ungenügende Forward- oder External-Deklaration: 'TLogFinderForm.ReadLog'

Zitat:

Zitat von mkinzler (Beitrag 1029536)
Oder stelle den Namen der Instanz der Komponente voran:
Delphi-Quellcode:
Form1.Label1.Text := 'Bl Bla Bla';
Wobei das ein schlechter Stil wäre ( und auch gewisse Gefahren birgt, da man immer auf eine bestimmte Instanz zugreift)

->Das funktioniert aber wenn das schlechter Stil ist würd ichs gern auf anderen Wege lösen, trozdem Danke für die Info

Zitat:

Zitat von Bernhard Geyer (Beitrag 1029544)
Zitat:

Zitat von BBJ (Beitrag 1029532)
In der Funktion möchte ich einmal sagen ProgressBar.Position:=ProgressBar.Position+1

Wieso übergibst du die zu verwendende Progressbar nicht als Parameter für deine Funktion?

->Das habe ich am Anfang auch immer gemacht aber wenn ich so 8 Komponenten habe, auf die jeweils einmal zugreife macht sich das immer Doof das noch in die riesige Parameterliste zu adden und alle funktionsaufrufe umzuschreiben falls mal wieder was dazu kommt

mkinzler 17. Jun 2010 15:21

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
  ...

Bernhard Geyer 17. Jun 2010 15:25

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Zitat von BBJ (Beitrag 1029657)
Wieso übergibst du die zu verwendende Progressbar nicht als Parameter für deine Funktion?

->Das habe ich am Anfang auch immer gemacht aber wenn ich so 8 Komponenten habe, auf die jeweils einmal zugreife macht sich das immer Doof das noch in die riesige Parameterliste zu adden und alle funktionsaufrufe umzuschreiben falls mal wieder was dazu kommt[/QUOTE]
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.

BBJ 17. Jun 2010 15:40

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Zitat von mkinzler (Beitrag 1029660)
Unter Implementation dann den Namen der Formularklasse voranstellen

Delphi-Quellcode:
function TForm1.ReadLog(Logname,searchstr :String;Liste:Tlistbox;HTTPrs:TidHTTP): String;
var
  ...

Das brachte weiter Fehler moment ich poste mal die Versuche und den Code

1. Dein Vorschlag den Namen vorne dran zuschreiben:

Delphi-Quellcode:
function TLogFinderForm.ReadLog(Logname,searchstr :String;Liste:Tlistbox;HTTPrs:TidHTTP): String;
var
  A,B:string;
  checker:integer;
begin
[...]
end;
Wenn ich den Aufruf der Funktion dann durch
Delphi-Quellcode:
ReadLog(SR.Name,Filter,LogBox,HTTPrs);
tätige bekomme ich den Fehler:
[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:
TLogFinderForm.ReadLog(SR.Name,Filter,LogBox,HTTPrs);
Folgender Fehler kommt dann beim Compiler..
[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

mkinzler 17. Jun 2010 15:42

AW: Komponenten in eigenen Funktionen verwenden
 
Beim Aufruf natürlich weglassen

DeddyH 17. Jun 2010 15:49

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:
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;
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.
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;

BBJ 17. Jun 2010 16:08

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Zitat von mkinzler (Beitrag 1029669)
Beim Aufruf natürlich weglassen

Habe ja geschrieben was für ein Fehler auftritt wenn ich das weglasse beim Aufruf
->[DCC Fehler] Unit1.pas(167): E2003 Undeklarierter Bezeichner: 'ReadLog'
Wie bekomme ich dann den Fehler weg?

mkinzler 17. Jun 2010 16:15

AW: Komponenten in eigenen Funktionen verwenden
 
Von wo rufst du es den auf?

BBJ 17. Jun 2010 16:23

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Zitat von mkinzler (Beitrag 1029684)
Von wo rufst du es den auf?

Alles passiert in der selben Unit auf der selben Form
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

DeddyH 17. Jun 2010 17:04

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Delphi-Quellcode:
TLogFinderForm.ReadLog(SR.Name,Filter,LogBox,HTTPrs);

Du hast hier die Klasse mit der Instanz verwechselt.

BBJ 17. Jun 2010 23:03

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Zitat von DeddyH (Beitrag 1029706)
Zitat:

Delphi-Quellcode:
TLogFinderForm.ReadLog(SR.Name,Filter,LogBox,HTTPrs);

Du hast hier die Klasse mit der Instanz verwechselt.

Die Parameter sind alle Korrekt, das sind ja variablennamen einfach nur, weder Klassen noch Instanzen.
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^^

Sir Rufo 17. Jun 2010 23:19

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Zitat von BBJ (Beitrag 1029816)
Zitat:

Zitat von DeddyH (Beitrag 1029706)
Zitat:

Delphi-Quellcode:
TLogFinderForm.ReadLog(SR.Name,Filter,LogBox,HTTPrs);

Du hast hier die Klasse mit der Instanz verwechselt.

Die Parameter sind alle Korrekt, das sind ja variablennamen einfach nur, weder Klassen noch Instanzen.
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^^

Du schmeisst hier Klassen und Instanzen durcheinander (oder hast noch nicht verstanden was das ist)

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:
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;
BTW:

Wenn du einen Klasse definierst oder erweiterst, dann solltest du mal CodeCompletion versuchen (Shift-Strg-C)

Du schreibst einfach
Delphi-Quellcode:
type
  TMeineKlasse = class
    procedure TuWas;
  end;
dann CodeCompletion (Shift-Strg-C) und es passiert folgendes
Delphi-Quellcode:
procedure TMeineKlasse.TuWas;
begin

end;
wird automatisch hinzugefügt und du kannst dort deinen Code reinschreiben

BBJ 17. Jun 2010 23:45

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 :)

Sir Rufo 18. Jun 2010 00:11

AW: Komponenten in eigenen Funktionen verwenden
 
Zitat:

Zitat von BBJ (Beitrag 1029822)
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 :)

Aber zaubern oder hellsehen können die Compiler/IDEs immer noch nicht (und wohl auch in Zukunft nicht).
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 05:41 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