Entwickler-Ecke

Sonstiges (Delphi) - Problem mit Tabsheets und array


c4fan - Di 24.08.04 15:59
Titel: Problem mit Tabsheets und array
Ich möchte eine Datei in einem Rich Edit öffnen welches während der Laufzeit erstellt wird und sich über Page Control auf einem Tabsheet befindet, welches auch während der Laufzeit erstellt wird. Mein Problem dabei ist, dass ich z.B. beim ersten Tabsgeet den dateinamen in einem array speichern möchte und auch wenn ich auf zweite Tabsheet klicke dessen Name speichern kann. Diesen aktuellen Dateinamen vom Öffnen lasse ich mir auf einem Label zur Kontrolle anzeigen aber so wie ich es möchte, dass mir beim wechseln der Tabsheets die aktuellen Dateinamen angezeigt werden.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  Form1: TForm1;
  Memo, memos : TRichEdit;
  index, i, a : integer;
  x : array [1..2of integer;
  s, o : string;
  dat : array [0..40of string;


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.TabSheet1.Caption:=' 0 ';
index:= (PageControl1.ActivePageIndex);
memos:= TRichEdit(findcomponent('RichEdit'+inttostr(index)));
end;


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.ffnen1Click(Sender: TObject);
begin
OpenDialog1.Filename:='';
if OpenDialog1.Execute then
Memos.Lines.LoadFromFile(OpenDialog1.Filename); 
o:=OpenDialog1.Filename;
dat[index]:=o;
form3.show;
form3.label1.Caption:= dat[index];
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.PageControl1Changing(Sender: TObject;
  var AllowChange: Boolean);
begin
dat[index+1]:= o;
form3.label1.Caption:= dat[index];
end;


Wie kann ich das Problem lösen? :(

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Maa83 - Mi 25.08.04 16:25

Wenn ich das richtig verstanden habe möchtest du folgendes machen:

Mehrere Dokumente öffnen die sich jeweils auf eigenen Tabsheets befinden.
Diese Dokumente möchtest du dann speichern können.

Da sich dies alles auf einen PageControl abspielt sollte das nicht allzu schwer sein.

Du hast ein dynamisches Array für den Pfad. Dieses kannst du je nachdem auf welchem Tabsheet du stehst anhand der Eigenschaft TPageControl.ActivePageIndex
auslesen.

Damit du weisst welches RichEdit du speichern musst kannst du diesem z.B. die gleiche Endzahl wie dem Tabsheet geben und die gleiche Endzahl wie dem Index des dynamischen Arrays. Also hat z.B. das erste Dokument den Tabsheet-Namen tsDok_0
das TRichedit redtDok_0 usw.

somit kannst du anhand des Namens das ganze ermitteln und abspeichern.

hoffe man kann mich verstehen :wink:


c4fan - Mi 25.08.04 22:50

schön das du mein vorhaben verstanden hast. Genau so sollte es eigentlich laut Quellcode funktionieren. Aber irgendetwas scheint mit dem array nicht zu stimmen aber ich komm nich drauf. Deswegen dachte ich vielleicht du findest den Fehler. :D


Maa83 - Do 26.08.04 08:56


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.PageControl1Changing(Sender: TObject;  
  var AllowChange: Boolean);  
begin  
dat[index+1]:= o;  
form3.label1.Caption:= dat[index];  
end;


Wieso änderst du das Array dat bei wechsel der Tabsheets?
Das Array besteht doch schon...

Reichen würde da:


Delphi-Quelltext
1:
form3.label1.Caption:= dat[PageControl1.ActivePageIndex];                    


kann sein das da noch ein +1 oder ein -1 hinter "ActivePageIndex" stehen muss.

nur was ich nicht sehe ist das du irgendetwas zur Laufzeit erzeugst???

Oder ist das nur ein Beispielcode?


c4fan - Do 26.08.04 10:53

Also die Tabsheets und Richedits erzeuge ich in einer buttonclick prozedure. Das mit dem +1-1 war auch nur zu testzwecken. Mein vorhaben ist, dass ich den jeweiligen Dateinamen zur Datei welche im Edit geöffnet wird in einem array gespeichertwird. So das Tabsheet zum Dateinamen passt verstehst du was ich meine?


Maa83 - Do 26.08.04 13:29

Also nochmal.

Der ganze Quellcode der jetzt kommt ist nicht getestet. Musst du also noch anpassen und ggf. korrigieren.

Du brauchst 4 Variablen.


Delphi-Quelltext
1:
2:
3:
4:
var tabDok : Array[0..10of TTabsheet;
    redtDok : Array[0..10of TRichEdit;
    Dateipfad : Array[0..10of String;
    AktivesDokument : Integer;




Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(...)
begin
    AktivesDokument := 0;
end;


Beim klicke auf den Button Dokument Erzeugen passiert folgendes:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.CreateDocument;
var OpenDLG : TOpenDialog;
    datpfad : String;
begin
    OpenDLG := TOpenDialog.Create(Self);   
    if OpenDLG.Execute then begin
        datpfad := OpenDLG.FileName;
    end;
    if datpfad = '' then exit;

    //Tabsheet erzeugen
    tabDok[AktivesDokument] := TTabSheet.Create(PageControl1);
    tabDok[AktivesDokument].Parent := PageControl1;
    //RichEdit erzeugen
    redtDok[AktivesDokument] := TRichEdit.Create(tabDok[AktivesDokument]);
    redtDok[AktivesDokument].Parent := tabDok[AktivesDokument];

    Dateipfad[AktivesDokument] := datpfad;
    inc(AktivesDokument)
end;


Beim speichern passiert dann folgendes:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.SaveDocument;
var datpfad : String;
begin
    datpfad := Dateipfad[PageControl1.ActivePageIndex];
    //Hier der Code zum Speichern (weiss den Befehl grad nicht, deswegen muss die untere Zeile angepasst werden!!!)
    redtDok[PageControl1.ActivePageIndex].Save(datpfad);
end;


Das wars.
Zur Einfachheit habe ich in diesem Codebeispiel statische Array genommen. Für so einen Fall sollte man eigentlich mit dynamischen Arrays arbeiten.

Falls du dazu auch noch Hilfe brauchst meld dich einfach noch mal. :)


c4fan - Fr 27.08.04 11:13

SO wie du das sagst habe ich das schon fast nur beim erstellen sieht die prozedure ein wenig anders aus:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button3Click(Sender: TObject);
var TabSheet:TTabSheet;
begin
  x[1]:= x[1]+1;
  TabSheet:=TTabSheet.Create(Form1.PageControl1);
  TabSheet.TabVisible:=True;
  TabSheet.PageControl:=Form1.PageControl1;
  TabSheet.Caption:= InttoStr((PageControl1.PageCount)-1);
  Memo:=TRichedit.Create(self);
  Memo.Parent:=TabSheet;
  Memo.Name:= ('RichEdit'+inttostr(x[1]));
  Memo.Lines.Clear;
  Memo.Width:=305;
  Memo.Height:= 361;
  Memo.Top:= 8;
  Memo.Left:= 8;
  Memo.PlainText:= true;
end;


Maa83 - Fr 27.08.04 11:31

dann vergleich halt mal die Teile und schau was verkehrt ist.

was soll dieses

x[1]:= x[1]+1;

???


c4fan - Fr 27.08.04 12:32

Da lege ich die Namen für RichEdit fest. Immer +1. Das heisst wenn ich ein neues feld haben möchte wird immer ein neues richedit erstellt. 1,2...


Maa83 - Fr 27.08.04 12:43

du überschreibts immer die Varibale Memo und die Variable Tabsheet.

mach es so wie ich es oben geschrieben habe dann funktioniert das ganze!


c4fan - Fr 27.08.04 17:30

Also so wie du es geschrieben hast, vermischt mit meinem Prog funktioniert es. Vielen Dank für Deine Bemühungen.