AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Controls nicht da, wo sie sein sollen
Thema durchsuchen
Ansicht
Themen-Optionen

Controls nicht da, wo sie sein sollen

Ein Thema von DevilsCamp · begonnen am 3. Aug 2006 · letzter Beitrag vom 3. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2      
DevilsCamp
(Gast)

n/a Beiträge
 
#1

Controls nicht da, wo sie sein sollen

  Alt 3. Aug 2006, 09:05
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.
Miniaturansicht angehängter Grafiken
falsch_147.jpg   richtig_152.jpg  
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#2

Re: Controls nicht da, wo sie sein sollen

  Alt 3. Aug 2006, 09:29
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
Thomas Breitkreuz
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#3

Re: Controls nicht da, wo sie sein sollen

  Alt 3. Aug 2006, 09:34
Aus der Unit soll später mal eine Komponente werden (sobald ich herausgefunden habe, wie man Forms als Komponenten einträgt ) und daher möchte ich keinen direkten Zugriff auf die Controls zulassen.

Ich benutze übrigens Delphi 7 Pro z.Z.
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi
Online

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.324 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Controls nicht da, wo sie sein sollen

  Alt 3. Aug 2006, 09:38
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
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#5

Re: Controls nicht da, wo sie sein sollen

  Alt 3. Aug 2006, 09:42
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>
Angehängte Dateien
Dateityp: pas frm_inputdialog_759.pas (4,2 KB, 2x aufgerufen)
Dateityp: dfm frm_inputdialog_183.dfm (481 Bytes, 1x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi
Online

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.324 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Controls nicht da, wo sie sein sollen

  Alt 3. Aug 2006, 09:57
Hallo,

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

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

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#7

Re: Controls nicht da, wo sie sein sollen

  Alt 3. Aug 2006, 10:07
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
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Controls nicht da, wo sie sein sollen

  Alt 3. Aug 2006, 10:15
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#9

Re: Controls nicht da, wo sie sein sollen

  Alt 3. Aug 2006, 10:32
Ich habe den Fehler gefunden:

Es lag an:
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.
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#10

Re: Controls nicht da, wo sie sein sollen

  Alt 3. Aug 2006, 10:35
@uligerhard: Du hast Recht. Meine Fehlaussage ist für mich jetzt was Wert. Habe einen alten Fehler in einer meiner Komponenten nun auch gefunden
@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
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz