![]() |
Controls nicht da, wo sie sein sollen
Liste der Anhänge anzeigen (Anzahl: 2)
Ich möchte in einem Projekt dem Benutzer die Möglichkeit geben, in einem Dialog einen Wert einzugeben. Leider öffnet mir die Funktion InputBox aus QDialogs das Fenster ständig in der Mitte des Desktops. Bei einem Monitor ja noch erträglich, doch bei zwei Monitoren wird das Fenster dann zur Hälfte auf Monitor 1 und die andere auf Monitor 2 angezeigt (sofern sie nebeneinander stehen).
Daher habe ich mir eine eigene Form geschrieben, die ich dann entsprechend ausrichten kann:
Delphi-Quellcode:
und noch die entsprechende DFM-Datei:
unit frm_InputDialog;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TfrmInputDialog = class(TForm) procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); private FMaxLength: Integer; FNumbersOnly: Boolean; FLabAnzeige: TLabel; FEdEdit: TEdit; FOkButton: TButton; FAbbButton: TButton; procedure SetMaxLength(const Value: Integer); procedure SetNumbersOnly(const Value: Boolean); function GetAnzeige: string; procedure SetAnzeige(const Value: string); function GetInput: string; procedure SetInput(const Value: string); { Private-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property MaxLength: Integer read FMaxLength write SetMaxLength; property NumbersOnly: Boolean read FNumbersOnly write SetNumbersOnly default false; property Anzeige: string read GetAnzeige write SetAnzeige; property Input: string read GetInput write SetInput; end; var frmInputDialog : TfrmInputDialog; implementation {$R *.dfm} constructor TfrmInputDialog.Create(AOwner: TComponent); begin inherited; FNumbersOnly := false; end; destructor TfrmInputDialog.Destroy; begin FLabAnzeige.Free; FEdEdit.Free; FOkButton.Free; FAbbButton.Free; inherited; end; procedure TfrmInputDialog.FormCreate(Sender: TObject); begin FLabAnzeige := TLabel.Create(Self); with FLabAnzeige do begin Name := 'Lab1'; Parent := Self; Left := 8; Top := 14; Width := 32; Height := 13; Caption := 'Label1'; end; FEdEdit := TEdit.Create(Self); with FEdEdit do begin Name := 'Ed1'; Parent := Self; Left := 8; Top := 39; Width := 244; Height := 21; Anchors := [akLeft, akRight]; TabOrder := 0; Text := ''; end; FOkButton := TButton.Create(Self); with FOkButton do begin Name := 'OKButton1'; Parent := Self; Tag := 60; Left := 25; Top := 77; Width := 100; Height := 25; Anchors := [akLeft, akBottom]; Caption := '&OK'; ModalResult := 1; TabOrder := 0; end; FAbbButton := TButton.Create(Self); with FAbbButton do begin Name := 'AbbButton2'; Parent := Self; Tag := 63; Left := 135; Top := 77; Width := 100; Height := 25; Anchors := [akRight, akBottom]; Caption := '&Cancel'; ModalResult := 2; TabOrder := 0; end; Caption := Format('%d %d', [FOkButton.Left, FOkButton.Top]); end; function TfrmInputDialog.GetAnzeige: string; begin Result := FLabAnzeige.Caption; end; function TfrmInputDialog.GetInput: string; begin Result := FEdEdit.Text; end; procedure TfrmInputDialog.SetAnzeige(const Value: string); begin if (Value <> FLabAnzeige.Caption) then begin FLabAnzeige.Caption := Value; ClientWidth := FLabAnzeige.Width + 16; end; end; procedure TfrmInputDialog.SetInput(const Value: string); var i : Integer; begin if (Value <> FEdEdit.Text) then begin if FNumbersOnly then begin try i := StrToInt(Value); FEdEdit.Text := Value; SetMaxLength(FMaxLength); except end; end; end; end; procedure TfrmInputDialog.SetMaxLength(const Value: Integer); var s : string; begin FMaxLength := Value; FEdEdit.MaxLength := FMaxLength; s := FEdEdit.Text; Delete(s, MaxLength + 1, Length(s)); FEdEdit.Text := s; end; procedure TfrmInputDialog.SetNumbersOnly(const Value: Boolean); var l : Integer; begin if (Value <> FNumbersOnly) then begin FNumbersOnly := Value; l := GetWindowLong(FEdEdit.Handle, GWL_STYLE); l := l or ES_NUMBER; if (not Value) then l := l xor ES_NUMBER; SetWindowLong(FEdEdit.Handle, GWL_STYLE, l); end; end; procedure TfrmInputDialog.FormShow(Sender: TObject); begin FEdEdit.SetFocus; end; end.
Delphi-Quellcode:
Doch leider gibt es da ein Problem:
object frmInputDialog: TfrmInputDialog
Left = 541 Top = 440 Width = 268 Height = 142 Color = clBtnFace Constraints.MaxHeight = 142 Constraints.MinHeight = 142 Constraints.MinWidth = 268 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Scaled = False OnCreate = FormCreate OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 end Solange ich die Anchors setze, werden die erstellten Controls zwar erst richtig auf die Form gelegt, sobald sie aber angezeigt werden soll ändern sich ihre Left und Top Werte und die Anzeige wird fehlerhaft. Siehe Anhänge. Eine Abhilfe wäre in der Methode FormShow die Werte neu zu setzen, aber das ist für mich eine nicht zufriedenstellende Lösung, da ich ja die Koordinaten richtig eingegeben habe und sie auch nicht verändere. Die Werte, die in der Titelleiste zusehen sind, sind die Left und Top Werte des OK-Buttons, ausgelesen direkt nach der Erstellung. Dieses Problem habe ich auch, wenn ich die Unit in anderen Projekten benutze. Ich hoffe, einer von euch kann mir helfen. |
Re: Controls nicht da, wo sie sein sollen
Hallo!
Ich habe gerade Dein Formular ausprobiert. Unter D2006 Professional ist die Darstellung ok. BTW: Warum erzeugst Du die Controls von Hand und legst diese nicht gleich auf die Form? Gruß onlinekater |
Re: Controls nicht da, wo sie sein sollen
Aus der Unit soll später mal eine Komponente werden (sobald ich herausgefunden habe, wie man Forms als Komponenten einträgt :D ) und daher möchte ich keinen direkten Zugriff auf die Controls zulassen.
Ich benutze übrigens Delphi 7 Pro z.Z. |
Re: Controls nicht da, wo sie sein sollen
kannst du mal bitte deine Unit oder Testprogramm mit Code anhängen?
ich hab auch D7 Pro, dann probier ich es mal bei mir aus |
Re: Controls nicht da, wo sie sein sollen
Liste der Anhänge anzeigen (Anzahl: 2)
Unit siehe oben (die ist komplett im ersten Post),
TestProgramm: Erstelle ein neues Projekt, setze einen Button in die neue Form und weise dem OnClick-Ereignis folgendes zu:
Delphi-Quellcode:
Die Unit in der TfrmInputDialog muss natürlich dann noch in das Testprojekt eingebunden werden.
procedure TForm1.Button1Click(Sender: TObject);
var i : Integer; s : String; begin Application.CreateForm(TfrmInputDialog, frmInputDialog); frmInputDialog.ShowModal; frmInputDialog.Free; end; Ich habe festgestellt, dass wenn ich die Anchors-Anweisungen weglasse, dass dann die Controls richtig angezeigt werden. Doch die sind nötig um die Buttons auch bei Größenänderungen an den entsprechenden Stellen zu halten ohne die neuen Positionen selbst berechnen zu müssen. Aber möglicherweise bleibt mir nichts anderes übrig :( <edit> Anhänge vergessen :) </edit> |
Re: Controls nicht da, wo sie sein sollen
Hallo,
wenn du bei den Buttons es wie folgt schreibst:
Delphi-Quellcode:
Dann passiert das nicht!
Anchors := [akLeft];
Ich msus gestehen, ich hab mit Anchors bisher noch nichts zu tun gehabt |
Re: Controls nicht da, wo sie sein sollen
Mir fällt da gerade noch ein Fehler in Deinem Create auf:
Delphi-Quellcode:
Kannst das ja mal ändern, schließlich sind die Anchors ja von Parent abhängig.
,
procedure TfrmInputDialog.FormCreate(Sender: TObject); begin FLabAnzeige := TLabel.Create(Self); FLabANzeige.Parent := Self: // --> so ist der Parent sicher korrekt with FLabAnzeige do begin Name := 'Lab1'; --> Parent := Self; <-- self bezieht sich hier eigentlich auf FLabAnzeige. Left := 8; Top := 14; Width := 32; Height := 13; Caption := 'Label1'; end; Hope it helps onlinekater |
Re: Controls nicht da, wo sie sein sollen
Zitat:
Uli. |
Re: Controls nicht da, wo sie sein sollen
Ich habe den Fehler gefunden:
Es lag an:
Delphi-Quellcode:
im Formular.
Scaled = False
Da ich keine automatische Skalierung wünsche habe ich sie natürlich auf False gestellt. Nachdem ich sie auf True gestellt hatte wurden die Buttons richtig angezeigt. |
Re: Controls nicht da, wo sie sein sollen
@uligerhard: Du hast Recht. Meine Fehlaussage ist für mich jetzt was Wert. Habe einen alten Fehler in einer meiner Komponenten nun auch gefunden :-D :-) :wall:
@DevilsCamp: vergiß mein letztes Posting Gruß onlinekater Nachtrag: Scaled=False juckt D2006 Prof hier nicht ... noch ein Nachtrag: Gerade mal mit D6 ausprobiert --> Problem wie von Dir beschrieben |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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 by Thomas Breitkreuz