Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ein Frame mit einem String mehrmals erstellen? (https://www.delphipraxis.net/138134-ein-frame-mit-einem-string-mehrmals-erstellen.html)

b00gie 4. Aug 2009 07:38


Ein Frame mit einem String mehrmals erstellen?
 
Hallo zusammen,

ich hab da ein kleines Problem, wo ich nicht "drüber" blicke... Also eigentlich ganz einfach.. Ich habe ein PageControl und erstelle dynamisch per Knopfdruck einen Reiter /neue Seite.
Da nun auf jeder Seite das selbe angezeigt werden soll, hab ich den Inhalt in ein Frame gepackt. Dieses Frame wird dann halt einfach nach dem erzeugen des neuen Reiters direkt miterzeugt und auf die Seite gepackt. Soweit funktioniert auch alles... Allerdings habe ich im Source vom Frage halt ein paar Variablen drin.

Gehen wir vom Beispiel String "Passwort" aus. Erstelle ich nun 10 Frames, so ist in diesem String immer das letzte Passwort drin, also wird der String jedes Mal überschrieben. Macht Sinn, aber irgendwie auch nicht, da ja der String im Frame-Source deklariert wird und das Frame 10mal geladen wird. Also müsste diese Variable auch 10mal existieren???

Wenn ich z.B. ein Edit-Feld nehme mit dem Namen "Edit1" kann ich 10 Frames erstellen und später einfach per "Frame[i].Edit1" drauf zugreifen, wie funktioniert nun sowas mit Variablen?

Ein Array kann ich nicht nutzen, weil ich nie weiß wieviele Reiter erstellen werden... mal 2.. mal 2000....




Gruß Niko

Mysterio08 4. Aug 2009 07:59

Re: Ein Frame mit einem String mehrmals erstellen?
 
Du könntest doch ein dynamischer Array nehmen und es dann immer wieder neu dimensionieren, oder habe ich da einen Teil deines Problems überlesen oder nicht verstanden?

FaTaLGuiLLoTiNe 4. Aug 2009 08:08

Re: Ein Frame mit einem String mehrmals erstellen?
 
Zitat:

Zitat von b00gie
Allerdings habe ich im Source vom Frage halt ein paar Variablen drin.

Gehen wir vom Beispiel String "Passwort" aus. Erstelle ich nun 10 Frames, so ist in diesem String immer das letzte Passwort drin, also wird der String jedes Mal überschrieben. Macht Sinn, aber irgendwie auch nicht, da ja der String im Frame-Source deklariert wird und das Frame 10mal geladen wird. Also müsste diese Variable auch 10mal existieren???

Ich würde jetzt mal darauf tippen, dass du mit 'im Source vom Frame' meinst, dass du die Variablen in der Unit deklariert hast, richtig?

Also etwa so:

Delphi-Quellcode:
unit MeineUnit;

interface

uses [...]

type
  TMeinFrame = class(TFrame)
    [...]
  private
    [...]
  public
    [...]
  end;

var MeinFrame: TMeinFrame;
    Variable1: Variablentyp1;   <--
    Variable2: Variablentyp2;   <-- Hier hast du deine Variablen deklariert
    Variable3: Variablentyp3;   <--

implementation

[...]
In diesem Fall hast du die Variablen nicht als Objektvariablen von TMeinFrame deklariert, sondern als globale Variablen. Das bedeutet, die Variablen kommen programmweit nur ein einziges Mal vor und werden jedesmal überschrieben, wenn du schreibend darauf zugreifst.

Du solltest stattdessen deine Variablen im 'private' - bzw. 'public' - Abschnitt der Klasse TMeinFrame deklarieren, je nachdem wie du die Sichtbarkeit der Variablen brauchst (da du ja von einem anderen Form darauf zugreifen willst, wäre wohl der 'public' - Abschnitt die richtige Wahl). Dann kannst du z.B. mit MeinFrame1.Variable1 auf deine Variablen zugreifen, wenn MeinFrame1 vom Typ TMeinFrame ist.

b00gie 4. Aug 2009 08:18

Re: Ein Frame mit einem String mehrmals erstellen?
 
ok danke :-D
Dachte mir schon das es was leichtes ist. Ich hab die Variablen in den public Teil gepackt jetzt läuft's. Danke euch


Gruß Niko

b00gie 4. Aug 2009 09:01

Re: Ein Frame mit einem String mehrmals erstellen?
 
okay, weiter gehen die Probleme... Also ich erstelle ja dynamisch ein Sheet und auf diesem Sheet wird ein dynamisch ein Frame geladen. Zum Test liegt auf dem Frame ein Memo1. Dies lädt Daten aus Dateien. wie kann ich nun aus der Hauptanwendung auf die Variablen der dynamischen Frames zugreifen?

Hier der Source
Delphi-Quellcode:
uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
var
  Sheet: TTabSheet;
  iFrame: TFrame2;
begin
  Sheet := TTabSheet.Create(PageControl1);
  Sheet.PageControl := PageControl1;
  Sheet.Parent := PageControl1;
  Sheet.Name := 'Sheet_' + IntToStr(i);

  iFrame := TFrame2.Create(Sheet);
  iFrame.Parent := Sheet;
  iFrame.Name := 'Frame_' + IntToStr(i);
  iFrame.Align := alClient;
  iFrame.Load(IntToStr(i)+'.ini');
  i := i + 1;
  PageControl1.ActivePageIndex := Sheet.PageIndex;
end;
und hier das Frame

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TFrame2 = class(TFrame)
    Memo1: TMemo;
    procedure Load(Name: String);
  private
    { Private declarations }
  public
    { Public declarations }
    sNick, sPW, sNH: String; //wie kann ich auf diese Variablen aus Unit1 (Hauptanwendung) zugreifen?
  end;

implementation

{$R *.DFM}

procedure TFrame2.Load(Name: String);
begin
  Memo1.Lines.LoadFromFile(Name);
  sNick := Memo1.Lines[0];
end;
end.

Uwe Raabe 4. Aug 2009 10:19

Re: Ein Frame mit einem String mehrmals erstellen?
 
Wenn auf dem TabSheet keine anderen Controls als das Frame liegen, geht das so:

Delphi-Quellcode:
PageControl1.ActivePage.Controls[0] as TFrame2
oder auch

Delphi-Quellcode:
PageControl1.Pages[I].Controls[0] as TFrame2

Namenloser 4. Aug 2009 10:29

Re: Ein Frame mit einem String mehrmals erstellen?
 
Meine Glaskugel sagt mir, dass hier Funktion und Darstellung nicht getrennt sind :glaskugel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 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