Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Controls nicht da, wo sie sein sollen (https://www.delphipraxis.net/74427-controls-nicht-da-wo-sie-sein-sollen.html)

DevilsCamp 3. Aug 2006 09:05


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:
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.
und noch die entsprechende DFM-Datei:
Delphi-Quellcode:
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
Doch leider gibt es da ein Problem:
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.

TBx 3. Aug 2006 09:29

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

DevilsCamp 3. Aug 2006 09:34

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.

Helmi 3. Aug 2006 09:38

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

DevilsCamp 3. Aug 2006 09:42

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:
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  s : String;
begin
  Application.CreateForm(TfrmInputDialog, frmInputDialog);
  frmInputDialog.ShowModal;
  frmInputDialog.Free;
end;
Die Unit in der TfrmInputDialog muss natürlich dann noch in das Testprojekt eingebunden werden.




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>

Helmi 3. Aug 2006 09:57

Re: Controls nicht da, wo sie sein sollen
 
Hallo,

wenn du bei den Buttons es wie folgt schreibst:
Delphi-Quellcode:
    Anchors := [akLeft];
Dann passiert das nicht!

Ich msus gestehen, ich hab mit Anchors bisher noch nichts zu tun gehabt

TBx 3. Aug 2006 10:07

Re: Controls nicht da, wo sie sein sollen
 
Mir fällt da gerade noch ein Fehler in Deinem Create auf:
Delphi-Quellcode:
,
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;
Kannst das ja mal ändern, schließlich sind die Anchors ja von Parent abhängig.

Hope it helps

onlinekater

uligerhardt 3. Aug 2006 10:15

Re: Controls nicht da, wo sie sein sollen
 
Zitat:

Zitat von onlinekater
Delphi-Quellcode:
  with FLabAnzeige do
  begin
    Name := 'Lab1';
-->   Parent := Self; <-- self bezieht sich hier eigentlich auf FLabAnzeige.

Du meinst Self in einem with-Block bezieht sich auf die with-Variable? Das bezweifle ich ganz stark, bin aber zu faul zum Ausprobieren. :-)

Uli.

DevilsCamp 3. Aug 2006 10:32

Re: Controls nicht da, wo sie sein sollen
 
Ich habe den Fehler gefunden:

Es lag an:
Delphi-Quellcode:
Scaled = False
im Formular.


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.

TBx 3. Aug 2006 10:35

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.
Seite 1 von 2  1 2      

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