AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PageControl - Problem

Ein Thema von Tommy1988 · begonnen am 19. Mai 2008 · letzter Beitrag vom 19. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2      
Tommy1988
(Gast)

n/a Beiträge
 
#1

PageControl - Problem

  Alt 19. Mai 2008, 09:43
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
  Mit Zitat antworten Zitat
Brainshock

Registriert seit: 26. Nov 2004
Ort: 37345
214 Beiträge
 
Delphi 7 Professional
 
#2

Re: PageControl - Problem

  Alt 19. Mai 2008, 10:22
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.

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ß,
Matthias
  Mit Zitat antworten Zitat
Tommy1988
(Gast)

n/a Beiträge
 
#3

Re: PageControl - Problem

  Alt 19. Mai 2008, 11:53
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
  Mit Zitat antworten Zitat
Brainshock

Registriert seit: 26. Nov 2004
Ort: 37345
214 Beiträge
 
Delphi 7 Professional
 
#4

Re: PageControl - Problem

  Alt 19. Mai 2008, 12:19
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ß,
Matthias
  Mit Zitat antworten Zitat
Tommy1988
(Gast)

n/a Beiträge
 
#5

Re: PageControl - Problem

  Alt 19. Mai 2008, 12:37
Irgentwas verstehe ich da nicht,

FActiveMemo.FileName <> '' Wieso FileName?
  Mit Zitat antworten Zitat
Brainshock

Registriert seit: 26. Nov 2004
Ort: 37345
214 Beiträge
 
Delphi 7 Professional
 
#6

Re: PageControl - Problem

  Alt 19. Mai 2008, 13:07
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.
Matthias
  Mit Zitat antworten Zitat
Tommy1988
(Gast)

n/a Beiträge
 
#7

Re: PageControl - Problem

  Alt 19. Mai 2008, 14:39
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?
  Mit Zitat antworten Zitat
Brainshock

Registriert seit: 26. Nov 2004
Ort: 37345
214 Beiträge
 
Delphi 7 Professional
 
#8

Re: PageControl - Problem

  Alt 19. Mai 2008, 15:20
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;
Matthias
  Mit Zitat antworten Zitat
Tommy1988
(Gast)

n/a Beiträge
 
#9

Re: PageControl - Problem

  Alt 19. Mai 2008, 17:14
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;
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#10

Re: PageControl - Problem

  Alt 19. Mai 2008, 17:30
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...
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 Uhr.
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