![]() |
Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen ->
Mit diesem Code erstelle ich ein paar Komponenten:
Globale Variablen:
Delphi-Quellcode:
Komponenten erstellen:
var anzSQL:Integer = 0;
Sheet : array of TTabSheet; SQLMemo : array of TSynMemo; SQLSyn : array of TSynSQLSyn;
Delphi-Quellcode:
Das klappt auch alles. Kompos werden erzeugt ohne Fehler
procedure TFrameDB.ButtonSQLNeuClick(Sender: TObject);
begin SetLength(Sheet, anzSQL + 1); SetLength(SQLMemo, anzSQL + 1); SetLength(SQLSyn, anzSQL + 1); // TabSheet erstellen Sheet[anzSQL] := TTabSheet.Create(PageControlSQL); Sheet[anzSQL].Parent := PageControlSQL; Sheet[anzSQL].PageControl := PageControlSQL; Sheet[anzSQL].Caption := '(Unbenannt)'; // SQLMemo erstellen SQLMemo[anzSQL] := TSynMemo.Create(Sheet[anzSQL]); SQLMemo[anzSQL].Parent := Sheet[anzSQL]; SQLMemo[anzSQL].Align := alClient; SQLMemo[anzSQL].RightEdge := 80; // SQLSyn erstellen SQLSyn[anzSQL] := TSynSQLSyn.Create(nil); SQLMemo[anzSQL].Highlighter := SQLSyn[anzSQL]; // PageControl auf erstellen TabSheet stellen Inc(anzSQL); PageControlSQL.ActivePageIndex := PageControlSQL.PageCount - 1; end; Wenn ich aber das ausführe, wird nichts geladen:
Delphi-Quellcode:
Woran kann das liegen?????
procedure TFrameDB.ButtonSQLLoadClick(Sender: TObject);
begin if OpenDialogSQL.Execute then begin TSynMemo(SQLMemo[PageControlSQL.ActivePageIndex]).Lines.LoadFromFile(OpenDialogSQL.FileName); TTabSheet(Sheet[PageControlSQL.ActivePageIndex]).Caption := OpenDialogSQL.FileName; TTabSheet(Sheet[PageControlSQL.ActivePageIndex]).Font.Style := []; end; // if OpenDialogSQL.Execute then end; |
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Moin Sebastian,
ich kann Dir jetzt zwar keine Lösung sagen, aber Du kannst die Typecasts (TSynMemo(...), TTabSheet(...)) weglassen, da die entsprechenden Angaben ja schon vom entsprechenden Typ sind. |
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Achso. Aber wo liegt der unterschied? Bzw. wofür benutzt man
Delphi-Quellcode:
TTabSheet[Sheet.....
|
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Moin Sebastian,
das brauchst Du, wenn der übergebene Typ oberhalb des gewünschten angesiedelt ist. Ein, auch hier, häufig anzuwendender Fall ist die Verwendung von FindComponent. Hier ist der Rückgabetyp TComponent, und i.d.R. benötigt man Eigenschaften / Methoden eines von TComponent abgeleiteten Typs. Um diese nun ansprechen zu können, muss man einen Typecast durchführen. Besser als
Delphi-Quellcode:
ist übrigens
TDatentyp(ObjektBezeichner)
Delphi-Quellcode:
da in letzterem Falle der Compiler schon eine Typprüfung vornimmt, so dass ungültige Typcasts schon zur Compilierzeit erkannt werden können. In ersterem Falle (TDatenTyp(...)), übernimmt der Entwickler die Verantwortung dafür, dass das angegebene Objekt auch wirklich so angesprochen werden kann.
(Objektbezeichner as TDatenTyp)
|
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Verstanden...Aber wirklich weitergebracht hat mich das jetzt nicht
|
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Moin Sebastian,
also einen Fehler kann ich nicht entdecken. Hast Du mal einen Breakpoint auf diese Zeile
Delphi-Quellcode:
gesetzt und überprüft, ob das Programm dort ankommt?
TSynMemo(SQLMemo[PageControlSQL.ActivePageIndex]).Lines.LoadFromFile(OpenDialogSQL.FileName);
Andere Möglichkeit: Hast Du mal die TabSheets durchgeklickt, ob die Datei eventuell in einem anderen Memo angezeigt wird? noch eine: Stehen in der Datei eventuell Binäre Nullen (z.B. wenn es sich um Unicode Dateien handelt)? Dann wird das Laden bei der ersten davon beendet. |
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Zitat:
|
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Moin Sebastian,
kannst Du mal die Datei hier als Attachement anhängen, mit der das nicht funktioniert? |
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Liste der Anhänge anzeigen (Anzahl: 1)
Die Unit des Frame, in der ich die Kompos erstelle und benutze
|
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Moin Sebastian,
ich hatte es geahnt... Die Textdatei, die nicht so will wie sie soll hatte ich gemeint ;-) |
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Häh? Versteh dich nicht ganz. Also mit statischen Kompos hat es einwandfrei geklappt. Wo liegt denn der Fehler?
|
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Moin Sebastian,
da ich SynEdit im Moment nicht installiert habe, habe ich das mal ohne Highlighter und mit TMemo nachgestellt:
Delphi-Quellcode:
Funktioniert problemlos.
var anzSQL:Integer = 0;
Sheet : array of TTabSheet; SQLMemo : array of TMemo; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin SetLength(Sheet, anzSQL + 1); SetLength(SQLMemo, anzSQL + 1); // TabSheet erstellen Sheet[anzSQL] := TTabSheet.Create(PageControlSQL); Sheet[anzSQL].Parent := PageControlSQL; Sheet[anzSQL].PageControl := PageControlSQL; Sheet[anzSQL].Caption := '(Unbenannt)'; // SQLMemo erstellen SQLMemo[anzSQL] := TMemo.Create(Sheet[anzSQL]); SQLMemo[anzSQL].Parent := Sheet[anzSQL]; SQLMemo[anzSQL].Align := alClient; // SQLSyn erstellen // PageControl auf erstellen TabSheet stellen Inc(anzSQL); PageControlSQL.ActivePageIndex := PageControlSQL.PageCount - 1; end; procedure TForm1.Button2Click(Sender: TObject); begin if OpenDialogSQL.Execute then begin SQLMemo[PageControlSQL.ActivePageIndex].Lines.LoadFromFile(OpenDialogSQL.FileName); Sheet[PageControlSQL.ActivePageIndex].Caption := OpenDialogSQL.FileName; Sheet[PageControlSQL.ActivePageIndex].Font.Style := []; end; // if OpenDialogSQL.Execute then end; Jetzt bleiben meiner Ansicht nach nur noch zwei Möglichkeiten:
Ich werd' mir noch mal SynEdit installieren und es dann noch einmal probieren. BTW: Wird denn die Caption des TabSheets bei Dir korrekt angezeigt? |
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Ich denk mal das liegt am SynEdit, da ich die TabSheet-Caption ohne Probleme auslesen und setzen kann
|
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Also mit nem normalen Memo gehts auch nicht :wall:
|
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Moin Sebastian,
Zitat:
Das was ich da oben gepostet habe benutzt ja TMemo, und damit geht's bei mir. :gruebel: |
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Neues Projekt erstellen und dann diesen Code:
Delphi-Quellcode:
Klappt! Jetzt versteh ich nicht warum das in meinem Prog nicht läuft. Den Source hab ich davon übernommen :-(
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) PageControlSQL: TPageControl; Button1: TButton; Button2: TButton; OpenDialog1: TOpenDialog; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; anzSQL:Integer = 0; Sheet : array of TTabSheet; SQLMemo : array of TMemo; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin SetLength(Sheet, anzSQL + 1); SetLength(SQLMemo, anzSQL + 1); // TabSheet erstellen Sheet[anzSQL] := TTabSheet.Create(PageControlSQL); Sheet[anzSQL].Parent := PageControlSQL; Sheet[anzSQL].PageControl := PageControlSQL; Sheet[anzSQL].Caption := '(Unbenannt)'; // SQLMemo erstellen SQLMemo[anzSQL] := TMemo.Create(Sheet[anzSQL]); SQLMemo[anzSQL].Parent := Sheet[anzSQL]; SQLMemo[anzSQL].Align := alClient; // PageControl auf erstellen TabSheet stellen Inc(anzSQL); PageControlSQL.ActivePageIndex := PageControlSQL.PageCount - 1; end; procedure TForm1.Button2Click(Sender: TObject); begin if OpenDialog1.Execute then begin SQLMemo[PageControlSQL.ActivePageIndex].Lines.LoadFromFile(OpenDialog1.FileName); end; end; end. |
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
FEHLER GEFUNDEN:
Ich hab ja ne Unit hochgeladen (eines Frames). Dieser Frame wird 4 mal erstellt. Das Programm hat den Text im Memo der ERSTEN Frames geladen, und ich war die ganze Zeit im VIERTEN Frame :wall: Gibt es globale Variablen die nur für den jeweiligen Frame verfügbaer sind??? und nicht im jeden. Das der jeden Frame komplett einzeln behandelt??? |
Re: Kompo dyn. erstellen -> Klappt. Dyn. Kompo benutzen -
Moin Sebastian,
soviel dann zum Thema "Globale Variablen" ;-) Füg' doch einfach (private?) Felder in das TFrameDB Objekt ein. Dann hast Du die gewünschte Zuordnung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 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-2025 by Thomas Breitkreuz