Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PageControl - Problem (https://www.delphipraxis.net/114057-pagecontrol-problem.html)

Tommy1988 19. Mai 2008 08:43


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:
procedure TForm1.PageControl2Change(Sender: TObject);
begin
 with PageControl2 do
  begin
   showmessage(ActiveMemo.Name);
   GetCurrentSyn.BringToFront;
  end;
end;
Die dazugehörige Funktion:
Delphi-Quellcode:
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;
So.. mein Problem:
Wie kann ich jetzt das aktive Memo speichern?

Mit EINEM Memo habe ich es so gemacht:
Delphi-Quellcode:
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;
Ich habe schon an ein Array gedacht, weis aber nicht wie ich was damit umsetzen soll :?

Brainshock 19. Mai 2008 09:22

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:
procedure TForm1.PageControl2Change(Sender: TObject);
begin
  // Setzen des Memos
  FActiveMemo:= ActiveMemo;
end;
Deine Funktion ActiveMemo ist nicht so richtig sinnig und ich habe Sie nochmal überarbeitet.

Delphi-Quellcode:
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;
In der Speichernfunktion kennst du dann das zu speichernde Memo über FActiveMemo.

Delphi-Quellcode:
FActiveMemo.SaveToFile(Fn);
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].

Gruß,

Tommy1988 19. Mai 2008 10:53

Re: PageControl - Problem
 
Naja, das mit dem SaveToFile mache ich ja noch so:

Delphi-Quellcode:
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;
Erkl.: Wenn Datei zuvor nicht "gespeichert" wurde (Fn also nicht existiert),
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 :(

Brainshock 19. Mai 2008 11:19

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:
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;
Implementierung der Methoden:

Delphi-Quellcode:
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;
Speichern:

Delphi-Quellcode:
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;
Gruß,

Tommy1988 19. Mai 2008 11:37

Re: PageControl - Problem
 
Irgentwas verstehe ich da nicht,

Delphi-Quellcode:
FActiveMemo.FileName <> ''
Wieso FileName?

Brainshock 19. Mai 2008 12:07

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.

Tommy1988 19. Mai 2008 13:39

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?

Brainshock 19. Mai 2008 14:20

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:
private
  FActiveMemo: TMyMemo;
  ...
end;
Wie fügst du neue Seiten dem PageControl2 hinzu?
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;

Tommy1988 19. Mai 2008 16:14

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;

geskill 19. Mai 2008 16:30

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


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

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