![]() |
text-string aus 2. klasse aufrufen
Ich habe 2.Klassen:
Tfmcon(klasse von tform) und TLoadsave (eigene klasse) sobald man auf einen button in der tfmcon klickt, öffnet sich ein aufruf in der tloadsave:
Delphi-Quellcode:
unitloadsave.log(mlog,'textbsp');
//'test' dient als stringausdruck (erläuterungstext aber siehe doch unten ;) ) // besser wäre es anstatt dem 'textbsp' in der eigenen log-methode dies bereits zu vereinbaren unud diese dann zu übergeben? in tloadsave steht dann folgende vereinbarung:
Delphi-Quellcode:
ich möchte den erlaeuterungs-text in einem tmemo in tfmcon anzeigen aber da gibts den crash.
//////////////////ÄNDERUNGSLOG////////////////
procedure TLoadSave.log(tsbboxsender:TMemo; erlaeuterung:string); begin tsbboxsender.lines.add(datetostr(now)+' :'); end; wäre es angebrachter mit set und get zu arbeiten? |
Re: text-string aus 2. klassen aufrufen
Welcher Fehler tritt wo genau auf?
|
Re: text-string aus 2. klassen aufrufen
Liste der Anhänge anzeigen (Anzahl: 1)
ich sehe gerad da fehlt noch eine methode:
also ich rufe durch einen button-klick folgende methode auf:
Delphi-Quellcode:
in der dazugehörigen klasse tloadsave steht:
unitloadsave.openfromfilediag(sgdat,opendialog1,edpath);
Delphi-Quellcode:
... implementation var fmlog: TMemo; ... ////////////////OPENDIALOG1////////////////////// procedure TLoadSave.openfromfilediag(sender: TStringgrid; opendiag: TOpendialog; edaltsender:TEdit); var i,j:byte; count:integer; log_dat:string; begin if opendiag.Execute then begin ... //Log-Daten setzen count:= opendiag.Files.Count; log_dat:=inttostr(count)+' Datei(en) geladen'; log(fmlog,log_dat); ... end; end; //////////////////ÄNDERUNGSLOG//////////////// procedure TLoadSave.log(tsbboxsender:TMemo; erlaeuterung:string); begin tsbboxsender.lines.add(datetostr(now)+' :'); ///////////////hier ist das PROBLEM: Zugriffsverletzung////////// end; |
Re: text-string aus 2. klassen aufrufen
-Was ist fmlog?
-Welcher Fehler? |
Re: text-string aus 2. klassen aufrufen
der sinn war, das man in der mainclass auf einen button klickt, sodass in der anderen klasse eine methode aufgerufen wird.
hinter dieser methode verbirgt sich die formatierung eines tmemo's in der mainclass, also es wird ein in der methode, welche in der unitloadsave.openfromfilediag() aufgerufen wird, unitloadsave.log() vorhandener string-wert in das tmemo der mainclass geschrieben. buttonclick -> procedure TLoadSave.openfromfilediag() aufgerufen -> procedure TLoadSave.log() aufgerufen |
Re: text-string aus 2. klassen aufrufen
Welcher Fehler?
|
Re: text-string aus 2. klassen aufrufen
fehlerdatei siehe oben.
mein problem ist es, in der log-datei zu sagen, daß er das memofeld von der mainclass nehmen soll. soll ich mit set und get arbeiten? |
Re: text-string aus 2. klassen aufrufen
Auf was zeigt fmlog?
|
Re: text-string aus 2. klassen aufrufen
im moment auf nix. ist nur als variable deklariert. aber die übergabe bereitet mir schwierigkeiten
|
Re: text-string aus 2. klassen aufrufen
Das F weist auf eine private Variable hin. Existiert eine Property? Getter/Setter?
|
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? |
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; |
Re: text-string aus 2. klassen aufrufen
danke dir erst mal. und wie vereinbare ich das dann in meiner log-methode?
Delphi-Quellcode:
wo code ich dann, dass fmlog gleich dem tmemo aus der mainclass ist?
//////////////////ÄNDERUNGSLOG////////////////
procedure TLoadSave.log(tsbboxsender:TMemo; erlaeuterung:string); begin tsbboxsender.lines.add(datetostr(now)+' :'); end; |
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:
Der Aufruf erfolgt dann so:
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.
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 ; |
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:
so geht das auch.
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); |
Re: text-string aus 2. klasse aufrufen
Zitat:
Zitat:
|
Re: text-string aus 2. klasse aufrufen
ohne
unitlog.setmemo(sendermemo); unitlog.setdiag(opendiag); geht das aber nicht weil dann eine zugriffsverletzung kommt. |
Re: text-string aus 2. klasse aufrufen
Dann zeig doch mal deine Log Methode komplett. Du hast irgendwo den Wurm drin.
|
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; |
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; |
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. |
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. |
Re: text-string aus 2. klasse aufrufen
Zitat:
|
Re: text-string aus 2. klasse aufrufen
Zitat:
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:
und die dazu gehörende Implementierung:
constructor Create (AStringList : TStrings; AOpenDialog : TOpenDialog) ; reintroduce ;
Delphi-Quellcode:
und die erweiterte Log Methode:
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;
Delphi-Quellcode:
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.
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 ; |
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 |
Re: text-string aus 2. klasse aufrufen
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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