Autor Beitrag
Ignitor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win 2000

BeitragVerfasst: So 05.09.04 21:36 
Hi!

Folgendes Problem:
Ich hab ein Fenster während der Laufzeit erzeugt. Dann hab ich ein Label erzeugt und es dem Fenster zugewiesen.
Und das Fenster erscheint, aber das Label anscheinend net!
Dann hab ich mir gedacht: "Ok, vielleicht musst du einfach nur noch die schriftfarbe festlegen!" und hab aus versehen label1.color auf clblack gesetzt! das hat zur folge gehabt, dass da ein schwarzer balken in dem fenster war! -> das label müßte also da sein!
dann hab ich label1.font.color auf clblack gesetzt statt label1.color, aber man sieht trozdem nix!!! :?!?:

Jemand 'ne idee??

ich post mal die eigenschaften von dem label, die ich festgelegt hab:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  label1 := TLabel.Create(form2);
  label1.Parent := form2;
  label1.Left := 4;
  label1.Top := 15;
  label1.Caption := 'Daten werden geladen...';
  label1.Font.Name := 'Arial';
  label1.Font.Size := 11;
  label1.font.Color := clblack;
  label1.visible := true;


Vielen lieben Dank schonmal für die Antworten!

Cu, Ignitor
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: So 05.09.04 22:19 
Hallo!

Also ich habe den folgenden Code ausprobiert und er funktioniert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.FormCreate(Sender: TObject);
var
  label1 : TLabel;
begin
  label1 := TLabel.Create(form1);
  label1.Parent := form1;
  label1.Left := 4;
  label1.Top := 15;
  label1.Caption := 'Daten werden geladen...';
  label1.Font.Name := 'Arial';
  label1.Font.Size := 11;
  label1.font.Color := clblack;
  label1.visible := True;
end;

Das Problem muss also wo anders liegen. Funktioniert es denn andere Controls zur Laufzeit auf Form2 zu erstellen.

Gruß
Tino
Ignitor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win 2000

BeitragVerfasst: So 05.09.04 22:48 
Edited:

also ich hab's auch schon mit 'nem StaticText probiert, da ist es das selbe problem!

ich wollte es eben mit 'nem Edit testen und dann kam ein error "Cannot focus disabled or invisible windows"....

des problem schein etwas komplizierter zu sein, als ich dachte...ich beschreib's mal vollständig:
ich hab eine PageControl auf meinem Form und zu dieser wird während der laufzeit ein tabsheet + inhalt hinzugefügt. da des aber so verdammt lange dauert (ich lade den inhalt für die componenten des tabsheets aus ini-dateien und des dauert ewig! liegt des vll daran, dass ich die daten über LAN von meinem anderen rechner hol?) hab ich mir gedacht wenigstens ein kleines fenster auf zu machen wo eben drin steht "Daten werden geladen".

ich poste mal den ganzen quelltext von der erzeugung von dem "ladefenster":
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure THauptfenster.zaubertabcreate;
var i : byte;
    currentbox : TChecklistBox;
    currenttext : TLabel;
    loadingform : TForm;
    ladentext : TLabel;
begin
  loadingform := TForm.Create(Hauptfenster); //könnte es vll daran liegen, dass ich ein
                                             //anderes form als Owner angegeben hab?
  try
  loadingform.Parent := Hauptfenster;
  loadingform.Caption := 'Lade...';
  loadingform.Enabled := true;
  loadingform.Left := 400;
  loadingform.Top := 300;
  loadingform.Width := 200;
  loadingform.Height := 80;
  loadingform.BorderStyle := bsDialog;
  loadingform.BorderIcons := [];
  ladentext := TLabel.Create(loadingform);
  ladentext.Parent := loadingform;
  ladentext.Left := 4;
  ladentext.Top := 20;
  ladentext.Caption := 'Daten werden geladen...';
  ladentext.Font.Name := 'Arial';
  ladentext.Font.Size := 11;
  ladentext.font.Color := clblack;
  loadingform.PixelsPerInch := 96;
  ladentext.Visible := true;
  loadingform.visible := true;             //<----- nach ausführung dieser Zeile -> Error
  zauber := TTabSheet.Create(PageControl1);
  // usw.


Hauptfenster ist mein 1. Form; loadingform mein "ladefenster", ladentext ist das label und zauber ist das tabsheet auf meinem hauptfenster (1. form), dass erzeugt werden soll.
und nach ausführung der vorletzten zeile des geposteten springt er mit der oben genannten error-message raus (wenn ich das edit statt dem label benutz!)!

Danke schonmal & nochmals für die Antworten!
CU, Ignitor
Ignitor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win 2000

BeitragVerfasst: Mo 06.09.04 09:42 
ok! ich hab inzwischen herausgefunden, dass die langen ladezeiten einfach nur daran liegen, dass ich die daten über's LAN abrufe.

aber warum der fehler auftritt bzw. wenn ich ein label nehm keine schrift angezeigt wird ist mir immer noch net klar!

ich hab's jetzt auch nochmal an meinem schnelleren rechner probiert, weil ich dachte, dass vielleicht einfach nur die zeit zwischen erscheinen und ausblenden des fensters für meinen lahmen rechner hier zu kurz ist und er dann irgendwie bei der darstellung hängt oder sowas in der richtung, aber da ist es das selbe! sogar wenn man eine kleine brake (z.b. mit sleep) einbaut!
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mo 06.09.04 09:45 
Ich hoffe, ich hab das beim kurzen durchlesen jetzt richtig verstanden:
Versuch es mit dem Label und nach dem Erzeugen und Zuweisen mach mal Application.ProcessMessages Vielleicht bringt das was
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 06.09.04 09:52 
Ansonsten setz mal, bevor du die Caption änderst, AutoSize des Labels auf True ODER leg Height und Width fest.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Ignitor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win 2000

BeitragVerfasst: Mo 06.09.04 10:03 
danke für die tips, aber bringt beides nix! :nixweiss:

ich hab auch eben nochmal ausprobiert, was passiert, wenn ich wieder die hintergrundfarbe des labels änder! anscheinend taucht des label jetzt garnimmer auf! zumindest sieht man jetzt nicht mal mehr 'nen schwarzen balken!
nike
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Win 2K, Win XP
D5 Ent.
BeitragVerfasst: Mo 06.09.04 10:31 
Hallo!

Ne ganz andere Idee, vielleicht ist dein "Parent" der Label falsch, da irgenwelche z.B. GroupBoxen das dynamische Label von der Sichtbarkeit her ueberlagern (aehnlich wie z-index bei css).

Wenns das nicht ist, dann solltest du wegen Netzwerk die Beschriftung asynchron setzen. => Also dynamisch Label erzeugen in Deiner Methode, aber in einer separaten Routine OnNetzDatenDa das Label.Caption setzen.

-

<Edit>
OK, da das Label eine Statusnachricht sein soll, noch ne dritte Moeglichkeit
Das Form2 hast Du ja zu Designzeit erzeugt, dann kannst Du das Label auch zur
Designzeit draufpappen mit Caption := '';
Dann nur bei Bedarf umaendern.
</Edit>
Gruss
nike


Zuletzt bearbeitet von nike am Mo 06.09.04 10:36, insgesamt 1-mal bearbeitet
Ignitor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win 2000

BeitragVerfasst: Mo 06.09.04 10:35 
also eigentlich erzeug ich nur des form und darauf dann des label (siehe oben) und an dem LAN kann's net liegen, weil's bei meinem anderen rechner (wo die daten auf der platte liegen) genauso ist! :|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 06.09.04 10:58 
Erstell das Label in OnCreate und ändere mal die Beschriftung im OnShow oder OnPaint jeweils mit einem Aufruf der TLabel.RePaint wenn du was geändert hast im Label. Merk dir aber mit einem Flag, ob das ganze zum ersten mal passiert oder nicht, sonst fängt er bei jedem Paint wieder von vorne an.
Ignitor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win 2000

BeitragVerfasst: Mo 06.09.04 11:25 
also damit ich die idee von luckie umsetzen konnte musste ich erstmal 'ne klasse von Tform ableiten (die neue klasse heißt TForm1), mit 2 methode: dem erzeugen des labels und dem repaint!
wenn ich das programm jetzt laufen lassen, dann kommt ein access violation error bei "ladentext.repaint" und wenn ich des weg lasse, dann kommt zwar das fenster, aber ohne label und hinterher eine access violation!

hier mal der code, wie ich des idee von luckie verstanden hatte:
ausblenden Delphi-Quelltext
1:
2:
3:
  loadingform.oncreate := loadingform.labelerstell;
  loadingform := TForm1.Create(Hauptfenster);
  loadingform.OnShow := loadingform.labelzeichen;


und hier die beiden methoden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.labelerstell(Sender : Tobject);
begin
  ladentext.Left := 4;
  ladentext.Top := 20;
  ladentext.Width := 50;
  ladentext.Height := 30;
  ladentext.Color := clblack;
  ladentext.Font.Name := 'Arial';
  ladentext.Font.Size := 11;
  ladentext.font.Color := clblack;
  ladentext.Visible := true;
end;

procedure TForm1.labelzeichen(Sender : TObject);
begin
  ladentext.Caption := 'Daten werden geladen...';
  ladentext.repaint;
end;
nike
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Win 2K, Win XP
D5 Ent.
BeitragVerfasst: Mo 06.09.04 12:00 
Hallo!

Also das ganze so kompliziert machen, denke ich ist uebertrieben.

Folgender Test bei mir hat gut geklappt:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    loadingform : TForm;
    ladentext : TLabel;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  loadingform := TForm.Create(self);
  loadingform.Parent := self;
  loadingform.Caption := 'Lade...';
  loadingform.Enabled := true;
  loadingform.Width := 200;
  loadingform.Height := 80;
<span style="font-weight: bold">  loadingform.Position := poOwnerFormCenter; </span> 
<span style="font-weight: bold">  loadingform.FormStyle := fsStayOnTop;</span>
<span style="font-weight: bold">  //loadingform.BorderStyle := bsDialog;</span> 
  loadingform.BorderIcons := [];
  ladentext := TLabel.Create(loadingform);
  ladentext.Parent := loadingform;
  ladentext.Left := 4;
  ladentext.Top := 20;
  ladentext.Caption := 'Daten werden geladen...';
  ladentext.Font.Name := 'Arial';
  ladentext.Font.Size := 11;
  ladentext.font.Color := clblack;
  loadingform.PixelsPerInch := 96;
  ladentext.Visible := true;
<span style="font-weight: bold">  loadingform.Show;</span>

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  loadingform.Release;
end;

end.


2 Butons draugeklatscht und entsprechend verknuepft. Aenderungen: Fett markiert

Achtung, wenn Du BorderStyle auf bsDialog setzt wird automatisch ein ShowDialog aufgerufen, das Form darunter kann nicht weiterarbeiten. Das koennte der Fehler sein?!?.

Gruss
nike
Ignitor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win 2000

BeitragVerfasst: Mo 06.09.04 12:41 
ok! ich hab's rausgefunden!!! es hatte wohl doch was mit der geschwindigkeit von dem laden zu tun!

bis nämlich das label auf dem form erzeugt und sichtbar war (gott weiß, warum der rechner so ewig brauch um ein bissi text zu erzeugen!) wurde schon wieder der release befehl aufgerufen!
hab des gemerkt, als ich den release befehl mal an ein buttonclick event angehängt hab und ihn dann mal manuell ausgeführt hab!

danke für die mühen!

cu, Ignitor