Delphi-PRAXiS
Seite 2 von 3     12 3      

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 14. Apr 2007 11:33

Re: text-string aus 2. klassen aufrufen
 
daran arbeite ich noch.

procedure TLoadSave.getmemo(tsbboxsender:TMemo);
begin fmlog:=tsbboxsender;
end;

weiß aber net ob das so richtig ist, und wie vor allem die set-methode arbeitet.
könntest du mal bitte einen lösungsansatz machen?

mkinzler 14. Apr 2007 11:36

Re: text-string aus 2. klassen aufrufen
 
Das ist eigentlich der Setter
Delphi-Quellcode:
procedure TLoadSave.setMemo(tsbboxsender:TMemo);
begin
    fmlog:=tsbboxsender;
end;

function TLoadSave.getMemo:TMemo;
begin
    result := fmlog;
end;

danku 14. Apr 2007 11:53

Re: text-string aus 2. klassen aufrufen
 
danke dir erst mal. und wie vereinbare ich das dann in meiner log-methode?
Delphi-Quellcode:
//////////////////ÄNDERUNGSLOG////////////////
procedure TLoadSave.log(tsbboxsender:TMemo; erlaeuterung:string);
begin
tsbboxsender.lines.add(datetostr(now)+' :');
end;
wo code ich dann, dass fmlog gleich dem tmemo aus der mainclass ist?

Jelly 14. Apr 2007 13:06

Re: text-string aus 2. klasse aufrufen
 
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 ;

danku 15. Apr 2007 10:50

Re: text-string aus 2. klasse aufrufen
 
ich hab das anders gelöst.
ohne konstruktor, weil doch der standardkonstruktor von delphi zur geltung kommt, sobald man keinen angibt.

Delphi-Quellcode:
procedure TLoad.openfromfilediag(sender: TStringgrid;
  opendiag: TOpendialog; edaltsender:TEdit; sendermemo: TMemo);
var i,j:byte;

begin
if opendiag.Execute then
  begin

...

   //Log-Daten setzen
   unitlog.setmemo(sendermemo);
   unitlog.setdiag(opendiag);
   unitlog.log(unitlog.getMemo,unitlog.getdiag,1, clblack);
so geht das auch.

Jelly 15. Apr 2007 10:58

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

Zitat von danku
ich hab das anders gelöst.
ohne konstruktor, weil doch der standardkonstruktor von delphi zur geltung kommt, sobald man keinen angibt.

Ich hab das Schlüsselwort reintroduce hinter dem Konstruktor stehen. Damit bist du gezwungen, diesen zu verwenden mit einem Parameter. Du kannst somit kein Objekt mehr erstellen mit dem Standardkonstruktor.

Zitat:

Zitat von danku
Delphi-Quellcode:
   unitlog.setmemo(sendermemo);
   unitlog.setdiag(opendiag);
   unitlog.log(unitlog.getMemo,unitlog.getdiag,1, clblack);
so geht das auch.

Das beisst sich immer noch in meinen Augen. mir ist klar, dass man unterschiedliche Techniken haben kann, um seine Welt in Klassen zu modelieren. Aber was mich hier stört ist, dass du als erstes das Memo mit SetMemo setzt. UnitLog kennt damit also das Logmemo. Bei SetDiag genau das gleiche. Das kann man so machen, von mir aus, und muss ja nicht über den Konstruktor übergeben werden. Aber warum schreibst du dann eine Log-Methode die dann 2 Parameter benötigt, die deinem Objekt ja eh schon bekannt sind. :gruebel: Entweder du sparst dir die ersten beiden Aufrufe, oder du kürzt bei der Log-Methode die ersten 2 Parameter weg.

danku 15. Apr 2007 11:16

Re: text-string aus 2. klasse aufrufen
 
ohne
unitlog.setmemo(sendermemo);
unitlog.setdiag(opendiag);

geht das aber nicht weil dann eine zugriffsverletzung kommt.

Jelly 15. Apr 2007 11:29

Re: text-string aus 2. klasse aufrufen
 
Dann zeig doch mal deine Log Methode komplett. Du hast irgendwo den Wurm drin.

danku 15. Apr 2007 11:49

Re: text-string aus 2. klasse aufrufen
 
Delphi-Quellcode:
function TLog.log(tsbboxsender:TMemo; opendiag: TOpendialog; erlaeuterung:byte; farbe: TColor):string;

    function shortcutarray(erlaeut:LongInt):string;
    var count:integer;
    begin


    //opendialog1
    setdiag(fmdiag);
    count:= opendiag.Files.Count;

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


var log_dat:string;
count,i:integer;
//erlauterung:byte;
begin



{case erlaeuterung of
1:Result:= inttostr(count)+' Datei(en) geladen';
2:Result:= 'test';
 end;          }

tsbboxsender.Font.Color:= farbe;
tsbboxsender.lines.add('['+TimeToStr(now)+'] : '+ shortcutarray((erlaeuterung)));

 for i:=0 to opendiag.files.count -1 do
   begin
   tsbboxsender.lines.add('                   -> '+ Extractfilename(opendiag.files.Strings[i]));
end;

end;

Jelly 15. Apr 2007 12:03

Re: text-string aus 2. klasse aufrufen
 
In welcher Zeile kommt den die Zurgiffsverletzung. Und was soll das hier in der ShortCutArray Funktion:
Delphi-Quellcode:
    //opendialog1 
    setdiag(fmdiag);
    count:= opendiag.Files.Count;


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

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