Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi text-string aus 2. klasse aufrufen (https://www.delphipraxis.net/90258-text-string-aus-2-klasse-aufrufen.html)

danku 15. Apr 2007 12:48

Re: text-string aus 2. klasse aufrufen
 
Liste der Anhänge anzeigen (Anzahl: 1)
der shortcutarray ist vielleicht von der bezeichnung her nicht treffend gewählt.

man übergibt der funktion den gewünschten wert (bspw. 1 und der rest wir halt ausgegeben)
unitlog.log(unitlog.getMemo,unitlog.getdiag,1, clblack);

das ist aber nicht das problem.

der fehler kommt bei der memoeigenschaft color.

Jelly 15. Apr 2007 13:02

Re: text-string aus 2. klasse aufrufen
 
Der Fehler deutet darauf hin, dass tsbboxsender nicht instanziert ist.
Machs, wie ich es dir vorgeschlagen hat, und du wirst die Probleme nicht mehr haben. In deinem Code geht einfach nicht klar hervor, wann du auf welche memo Komponente zugreifst.

danku 16. Apr 2007 15:59

Re: text-string aus 2. klasse aufrufen
 
Zitat:

Zitat von Jelly
Ich hab das Gefühl, du hast das Konzept der OO Programmierung nicht ganz verstanden. Sinn ist es, dass Objekte eigenständig arbeiten sollen. In deinem Fall ist die Klasse TLoadSave. Und so wie es aussieht, soll die Texte in einem Memo wegloggen. Es macht dann keinen Sinn, bei jedem Aufruf deiner Log Methode das Memo mitzuübergeben. So Sachen macht man einmal, in deinem Fall würd ich es im Constructor machen. Und um bischen flexibel zu bleiben, würde ich mich nicht auf ein Memo beschränken, sondern würde im Constructor einfach eine TStrings Instanz übergeben.

Delphi-Quellcode:
unit uLoadSave;

interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls ;

type
  TLoadSave = class
  private
     FStringList: TStrings;
  public
     constructor Create (AStringList : TStrings) ; reintroduce ;
     property StringList : TStrings read FStringList write FStringList ;

     procedure Log (What : string) ;
  end;

implementation

{ TLoadSave }

constructor TLoadSave.Create(AStringList: TStrings);
begin
     inherited Create ;
     assert (assigned(AStringList) and (AStringList is TStrings),'Bitte StringList Objekt im Constructor übergeben') ;

     FStringList := AStringList ;
end;

procedure TLoadSave.Log(What: string);
begin
     FStringList.Add (What) ;
end;

end.
Der Aufruf erfolgt dann so:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
     LS := TLoadSave (memo1.lines) ;  // LS als Variable in deiner Form deklarieren
end;

procedure TForm1.Button1Click (Sender : TObject) ;
begin
    LS.Log ('Halleluja') ;
end ;

nimms mir nicht übel aber mit dem LS kann ich nichts anfangen. dieser dient doch als klassenbezeichner (punkt-notation) um damit die methoden aufzurufen. es gehört trotzdem noch get und set mit in die unit oder? bei procedure TLoad.Log(What: string); kommt eine EAccessViolation Meldung

Jelly 16. Apr 2007 16:17

Re: text-string aus 2. klasse aufrufen
 
Zitat:

Zitat von danku
nimms mir nicht übel aber mit dem LS kann ich nichts anfangen. dieser dient doch als klassenbezeichner (punkt-notation) um damit die methoden aufzurufen. es gehört trotzdem noch get und set mit in die unit oder? bei procedure TLoad.Log(What: string); kommt eine EAccessViolation Meldung

Verwechsle Klasse nicht mit Objekt=Instanz einer Klasse :!:

Aber natürlich müsstest du den Code anpassen, damit deine Klasse auch vom OpenDialog Bescheid weiss. Würd ich ebenfalls entweder über den Konstruktor mit übergeben, oder im bestehenden Konstruktor eine eigenen TOpenDialog Instanz erzeugen. Ich tendiere zu letzterem, aber das ist wirklich Geschmackssache. Deshalb, weils jetzt wohl schneller so geht, doch erste Möglichkeit:

Delphi-Quellcode:
constructor Create (AStringList : TStrings; AOpenDialog : TOpenDialog) ; reintroduce ;
und die dazu gehörende Implementierung:
Delphi-Quellcode:
constructor TLoadSave.Create(AStringList: TStrings);
begin
     inherited Create ;
     assert (assigned(AStringList) and (AStringList is TStrings),'Bitte StringList Objekt im Constructor übergeben') ;
     assert (assigned(AOpenDialog) and (AOpenDialog is TOpenDialog),'Bitte OpenDaialog Objekt im Constructor übergeben') ;


     FStringList := AStringList ;
     FOpenDialog := AOpenDialog ;
end;
und die erweiterte Log Methode:
Delphi-Quellcode:
procedure TLoadSave.Log(What: string);
    function shortcutarray(erlaeut:LongInt):string;
    var
      count:integer;
    begin
       count:= FOpenDialog.Files.Count;

       case erlaeut of
           1 : Result:= inttostr(count)+' Datei(en) geladen';
           2 : Result:= 'test22';
       end;
    end;


var
  log_dat:string;
  count,i:integer;
begin
    FStringList.lines.add('['+TimeToStr(now)+'] : '+ shortcutarray((erlaeuterung)));

    for i:=0 to FOpenDialog.files.count -1 do
    begin
           FStringList.lines.add('                   -> '+ Extractfilename(FOpenDialog.files.Strings[i]));
    end;
end ;
Soll nun wirklich die Farbe mit in der Log Methode übergeben werden, so sollte eventuell wirklich anstatt einer TStringList ein TMemo im Konstruktor übergeben werden, und auch im restlichen Code daran angepasst werden.

danku 16. Apr 2007 16:42

Re: text-string aus 2. klasse aufrufen
 
ja die farbe sollte mit übernommen werden.
muss alles in den konstruktor rein, was an die mainform übergeben wird?
das ist mir ein wenig konfus. in c# gefällt mir das ein wenig besser, da hab ich nicht soviel schreibarbeit

Jelly 16. Apr 2007 21:04

Re: text-string aus 2. klasse aufrufen
 
Zitat:

Zitat von danku
muss alles in den konstruktor rein, was an die mainform übergeben wird?

Nö, müssen nicht. Aber das ist eine Methode die sicherstellt, dass der Anwender nichts vergisst. Deine Klasse ist auf 2 Parameter angewiesen, um überhaupt arbeiten zu können: Ein OpenDialog und ein Memo. Also würd ichs in den Constructor packen. Das erspart dir in den restlichen Methoden das Prüfen, ob auch ein Memo und ein Opendialog zugewiesen ist.
Zitat:

Zitat von danku
in c# gefällt mir das ein wenig besser, da hab ich nicht soviel schreibarbeit

Das musst Du mir erklären. Denn da funktioniert das genauso. Da hast du auch constructor und Methoden, und properties die du mit setter- und getter Methoden ausrüsten kannst. Was erspart dir da Tipparbeit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 Uhr.
Seite 3 von 3     123   

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