| Autor |
Beitrag |
Ignitor
      
Beiträge: 18
Win 2000
|
Verfasst: 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:
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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: So 05.09.04 22:19
Hallo!
Also ich habe den folgenden Code ausprobiert und er funktioniert:
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 
      
Beiträge: 18
Win 2000
|
Verfasst: 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":
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); 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; zauber := TTabSheet.Create(PageControl1); |
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 
      
Beiträge: 18
Win 2000
|
Verfasst: 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
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 18
Win 2000
|
Verfasst: Mo 06.09.04 10:03
danke für die tips, aber bringt beides nix!
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
      
Beiträge: 48
Win 2K, Win XP
D5 Ent.
|
Verfasst: 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 
      
Beiträge: 18
Win 2000
|
Verfasst: 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
|
Verfasst: 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 
      
Beiträge: 18
Win 2000
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3:
| loadingform.oncreate := loadingform.labelerstell; loadingform := TForm1.Create(Hauptfenster); loadingform.OnShow := loadingform.labelzeichen; |
und hier die beiden methoden:
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
      
Beiträge: 48
Win 2K, Win XP
D5 Ent.
|
Verfasst: Mo 06.09.04 12:00
Hallo!
Also das ganze so kompliziert machen, denke ich ist uebertrieben.
Folgender Test bei mir hat gut geklappt:
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 loadingform : TForm; ladentext : TLabel; public 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.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 
      
Beiträge: 18
Win 2000
|
Verfasst: 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
|
|