![]() |
PageControl - Problem
Also,
vor längerer Zeit habe ich mal angefangen einen Editor zu schreiben, den ich seither stetig weiterentwickle. Nun habe ich ein PageControl eingebaut, welches zum Tabbes-Browsing dient. (Heißt es so?) Klick auf Button = Neues Tab mit neuem Memo wird erstellt. (MemoX) , X fortlaufend. Mit folgendem Code lasse ich mir (NUR für mich zum "sehen") anzeigen welches Tab aktiv ist.
Delphi-Quellcode:
Die dazugehörige Funktion:
procedure TForm1.PageControl2Change(Sender: TObject);
begin with PageControl2 do begin showmessage(ActiveMemo.Name); GetCurrentSyn.BringToFront; end; end;
Delphi-Quellcode:
So.. mein Problem:
function TForm1.ActiveMemo: TMemo;
begin Result := nil; with PageControl2 do if ActivePage.ControlCount > 0 then begin if ActivePage.Controls[0] is TMemo then begin Result := (TMemo(ActivePage.Controls[0])); end else begin if Result = nil then Result := MainMemo; end; end; end; Wie kann ich jetzt das aktive Memo speichern? Mit EINEM Memo habe ich es so gemacht:
Delphi-Quellcode:
Ich habe schon an ein Array gedacht, weis aber nicht wie ich was damit umsetzen soll :?
try
if Saved then exit; // Saved wird true, wenn datei schonmal "abgespeichert" wurde. // das hier unten ist "Schnellspeicherung" if FileExists(Fn) then begin Memo1.Lines.SaveToFile(Fn); Saved := True; ShortFn := ExtractFilename(Fn); TBXStatusBar1.Panels[3].Caption := ''; end else begin TBXItem3Click(self); TBXItem2.Enabled := False; TBXItem42.Enabled := False; TBXStatusBar1.Panels[3].Caption := ''; end; except // end; |
Re: PageControl - Problem
Setze beim Wechsel einfach eine private globale Variable, in der du einen Verweis auf das aktive Memo hast.
Delphi-Quellcode:
private
FActiveMemo: TMemo; ... end;
Delphi-Quellcode:
Deine Funktion ActiveMemo ist nicht so richtig sinnig und ich habe Sie nochmal überarbeitet.
procedure TForm1.PageControl2Change(Sender: TObject);
begin // Setzen des Memos FActiveMemo:= ActiveMemo; end;
Delphi-Quellcode:
In der Speichernfunktion kennst du dann das zu speichernde Memo über FActiveMemo.
function TForm1.ActiveMemo: TMemo;
var i: Integer; begin Result := MainMemo; with PageControl2 do begin for i:= 0 to Pred(ActivePage.ControlCount) do begin if ActivePage.Controls[i] is TMemo then begin Result := (TMemo(ActivePage.Controls[i])); Break; end; end; end; end;
Delphi-Quellcode:
Die Memos könnte man für den direkten Zugriff noch in einer Objektliste (TObjectlist) oder ähnlichem zwischenspeichern. Der Zugriff wäre dann z.B. über den PageIndex möglich, z.B. FMemos[PageControl2.PageIndex].
FActiveMemo.SaveToFile(Fn);
Gruß, |
Re: PageControl - Problem
Naja, das mit dem SaveToFile mache ich ja noch so:
Delphi-Quellcode:
Erkl.: Wenn Datei zuvor nicht "gespeichert" wurde (Fn also nicht existiert),
try
//if Saved then exit; if FileExists(Fn) then begin //SynMemo1.Lines.SaveToFile(Fn); FActiveMemo.Lines.SaveToFile(Fn); Saved := True; ShortFn := ExtractFilename(Fn); SetCompleteCaption; TBXStatusBar1.Panels[3].Caption := ''; end else begin TBXItem3Click(self); TBXItem2.Enabled := False; TBXItem42.Enabled := False; TBXStatusBar1.Panels[3].Caption := ''; end; except // end; wird TBXItem3Click(self); ausgeführt. Da steht drin, dass ein SaveDialog geöffnet werden soll... Anderenfalls wird FActiveMemo.Lines.SaveToFile(Fn); ausgeführt. Leider ist dann aber Fn immer das gleich wie zuvor :( |
Re: PageControl - Problem
Naja, gibt ja tausende von Möglichkeiten das zu lösen. Eine Lösung wäre, das TMemo abzuleiten und den Dateinamen beim Laden und Speichern zwischenzuspeichern. Beispiel:
Delphi-Quellcode:
Implementierung der Methoden:
TMyMemo = class (TMemo)
private FFileName: String; public procedure LoadFromFile(const AFileName: String); procedure SaveToFile(const AFileName: String); property FileName: String read FFileName write FFileName end;
Delphi-Quellcode:
Speichern:
procedure TMyMemo.LoadFromFile(const AFileName: String);
begin Self.Lines.LoadFromFile(AFileName); FFileName:= AFileName; end; procedure TMyMemo.SaveToFile(const AFileName: String); begin Self.Lines.SaveToFile(AFileName); FFileName:= AFileName; end;
Delphi-Quellcode:
Gruß,
if FActiveMemo.FileName <> '') then
begin FActiveMemo.SaveToFile(FActiveMemo.FileName); Saved := True; ShortFn := ExtractFilename(Fn); SetCompleteCaption; TBXStatusBar1.Panels[3].Caption := ''; end else begin TBXItem3Click(self); TBXItem2.Enabled := False; TBXItem42.Enabled := False; TBXStatusBar1.Panels[3].Caption := ''; end; |
Re: PageControl - Problem
Irgentwas verstehe ich da nicht,
Delphi-Quellcode:
Wieso FileName?
FActiveMemo.FileName <> ''
|
Re: PageControl - Problem
Also, du leitest deine Memoklasse ab und fügst eine neue Eigenschaft FileName hinzu, siehe Quellcodeausschnitt 1 und 2 aus dem vorherigen Post. In der Eigenschaft wird der jeweilige Dateiname des Memoinhalts gespeichert, Ersatz für dein fn.
In deiner Speichernfunktion kontrollierst du über FActiveMemo.FileName <> '', ob das Memo schon in einer Datei gespeichert wurde. Ist der Wert der Eigenschaft nicht gesetzt, wurde das Memo noch nicht gespeichert. Die Eigenschaft wird durch FActiveMemo.SaveToFile() gesetzt. |
Re: PageControl - Problem
Mhh.. ok, Das habe ich verstanden, was ich aber nicht verstehe ist, weshalb der Compiler sagt, dass FileName undefiniert sei... obwohl es doch geschrieben war?
|
Re: PageControl - Problem
Der Typ der Variable FActiveMemo muß jetzt FMyMemo sein, wie auch deine Memos im PageControl, dann sollte er FileName auch kennen.
Delphi-Quellcode:
Wie fügst du neue Seiten dem PageControl2 hinzu?
private
FActiveMemo: TMyMemo; ... end; Die Erzeugung der Memos muß nämlich auch geändert werden, nach dem Shema:
Delphi-Quellcode:
var
NewPage: TTabSheet; NewMemo: TMyMemo; begin ... NewPage:= TTabSheet.Create(PageControl2); NewPage.PageControl:= PageControl2; NewMemo:= TMyMemo.Create(NewPage); NewMemo.Parent:= NewPage; ... end; |
Re: PageControl - Problem
Ich erstelle sie etwas anders:
Delphi-Quellcode:
function TForm1.CreateTabBrowser(sURL, sCaption: string):TTabSheet;
var ts: TTabSheet; SN: TSynMemo; begin ts := TTabSheet.Create(PageControl2); Result := ts; try ts.PageControl := PageControl2; ts.Parent := PageControl2; ts.Caption := sCaption; ts.PageIndex := PageControl2.ActivePageIndex + 1; SN := TSynMemo.Create(ts); SN.Name := 'SynMemo'+IntToStr(pcPage); SN.BringToFront; // TSynMemo auf TTabSheet TControl(SN).Parent := ts; SN.Align := alClient; SN.Visible := True; PageControl2.ActivePage := ts; except ts.Free; end; end; |
Re: PageControl - Problem
Ich würde den TabSheet und das Memo einfach dynamisch erstellen, und den Zeiger vom Memo in eine TList abspeichern, so kann man immer mit dem ActivePageIndex des PageControls arbeiten.
So kann man dann sehr einfach ein Drag & Drop System für die TabSheets erstellen. Wenn das näher interessiert kann ich ja code aus einem meiner Projekte posten, ansonsten dürfte die suche im Forum weiterhelfen... |
Re: PageControl - Problem
Ok,
meinen Code habe ich jetzt komplett angepasst, jedoch erhalte ich beim "STRG+S"-Drücken eine Exception, Zugriffsverletzung an dieser Stelle: "if (FActiveMemo.FileName <> '') then" Ich kann keinen Fehler erkennen? |
Re: PageControl - Problem
Okay,
das dürfte etwas länger werden... eigentlich aber sehr einfach zu verstehen... Zuerst brauchen wir eine Globale Variale vom Typ "TList".
Delphi-Quellcode:
Dann müssen wir beim Programmstart (OnFormCreate) etwas speicher dafür anfordern.
MemoList : TList;
Delphi-Quellcode:
Damit wir wirklich sauber Programmieren geben wir den Speicher am Programmende (OnFormDestroy) wieder frei.
MemoList := TList.Create;
Delphi-Quellcode:
Okay, jetzt baut man sich eine Prozedur, womit man Tabs hinzufügt.
MemoList.Free;
Delphi-Quellcode:
Okay, nun hat man ein neues Tab erstellt, nun noch eine Speicher Prozedur:
PROCEDURE NewWindow(WindowName:String);
VAR NewTabSheet:TTabSheet; NewMemo:TMemo; BEGIN NewTabSheet := TTabSheet.Create(MainForm); // speicher auf dem Formular "MainForm" anfordern WITH NewTabSheet DO BEGIN PageControl := MainForm.PageControl; // das Tab dem PageControl zuweisen ShowClose := TRUE; Caption := WindowName; // als kleines Extra kann man hier noch den Namen seperat bestimmen END; NewTabSheet.OnClose := WindowOnClose; // die OnClose Funktion muss rein für das Freigeben des Speichers NewMemo := TMemo.Create(MainForm); // speicher auf dem Formular "MainForm" anfordern für das neue Memo MemoList.Add(NewMemo); // der virtuellen Liste das neue MemoFeld hinzufügen WITH NewMemo DO BEGIN Parent := NewTabSheet; // so wird das Memo auf dem neuen TabSheet plaziert. // Platz für weitere Eigenschaften, wie Größe etc. END; END;
Delphi-Quellcode:
Okay, das wars, du bräuchtest noch ein OnClose, damit du den Speicher nicht zuknallst,
PROCEDURE Save;
VAR Memo : TMemo; BEGIN Memo := MemoList.Items[PageControl.ActivePageIndex]; // nun wird die Variable Memo mit dem Inhalt des Memos gefüllt was gerade aktiv ist IF SaveDialog.Execute THEN Memo.Lines.SaveToFile(SaveDialog.FileName); // einfache Speichermöglichkeit END; aber mach dich erstmal hier rann ;-) Wenn Fragen sind ich antworte gerne :-) |
Re: PageControl - Problem
Liste der Anhänge anzeigen (Anzahl: 1)
Okay,
ich habe dir jetzt noch ein Beispiel geschrieben... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18: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 by Thomas Breitkreuz