Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Inputbox mit autmatischer Längenanpassung wie Messagebox (https://www.delphipraxis.net/163715-inputbox-mit-autmatischer-laengenanpassung-wie-messagebox.html)

v2afrank 13. Okt 2011 07:11


Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Hallo,
ich bin auf der Suche nach einer Inputboxfunktion für Delphi 2006 die die Breite des Fenster nicht abhängig von der durchschnittlichen Breite der einzelnen Buchstaben macht sondern abhängig von der Länge des eingegebenen Textes, wie es auch die Messagebox macht.
Ich brauche das für eine lange Frage an den User, die auch mehrere Zeilenumbrüche enthält. Eine Messagebox zeigt die Frage vernünftig an, Inputbox kürzt den Text aber sehr unglücklich.
Gibt es da was fertiges oder muss ich die Funktion selber schreiben ?

Bummi 13. Okt 2011 09:40

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
InputBox
InputQuery
GetAveCharSize

aus Dialogs kopieren und TEdit durch TMemo ersetzen?

DeddyH 13. Okt 2011 09:44

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Ich habe das so verstanden, dass es nicht um das Eingabefeld geht, sondern um den Text darüber. Etwas Fertiges kenne ich da auch nicht aus dem Hut, aber mit DrawText und DT_CALCRECT könnte man zumindest die benötigten Dimensionen errechnen lassen.

v2afrank 13. Okt 2011 09:46

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Genau, darum ging es.
Mir ging es um die Länge des Labels. Dieses wird ja nicht anhand der wirklichen Länge des Textes gesetzt sondern 180*AverageCharSize/4.
Ich bin gerade dabei mir eine Funktion zu schreiben die das über GetTextWidth löst. DT_CALCRECT schau ich mir noch mal an

Bummi 13. Okt 2011 09:52

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
ups , ok. Wenn Du Deinen Text vorher mit #13#10 versiehst?

v2afrank 13. Okt 2011 10:15

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Geht es schief. An der Stelle wird zwar ein Zeilenumbruch gemacht, aber es wird zusätzlich noch ein Zeilenumbruch am Ende des Fensters gemacht. Probier es aus (mein Chef will unbedingt diesen Text haben):
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
const Frage='Select the device variant.'+#13#10+
            '==============='+#13#10#13#10+
            '1 - UPS with compact powerblock'+#13#10+
            '    TempSensors R1.1 / R2.1 / R3.1 on REC -  R4.1 / R5.1 / R6.1 on INV'+#13#10#13#10+
            '2 - UPS with high powerblocks'#13#10+
            '    TempSensors R1,1 / R1.2 / R2.1 / R2.2 / R3.1 / R3.2 on REC -  R4.2 / R5.2 / R6.2 on INV'+#13#10#13#10+
            '3 - UPS with high powerblocks'+#13#10+
            '    TempSensors R1.1 / R1.2 / R2.1 / R2.2 / R3.1 / R3.2 on REC -  R4.1 / R4.3 / R5.1 / R5.3 / R6.1 / R6.3 on INV'+#13#10#13#10;

begin
  MessageBox(0, Frage, 'Test', MB_ICONWARNING or MB_OK);
 InputBox(Application.Title,Frage,'');
end;
Messagebox zeigt es zumindest unter XP vernünftig formatiert an (Unter Windows 7 ist es ein bischen verschoben).
Inputbox bricht aber schon vorher den Text um.

Dabei habe ich noch ein interessantes Phänomen entdeckt. Compiliere ich das unter XE2 kann man die Inputbox gar nicht mehr erkennen. Da scheint Embarcadero einiges verändert zu haben. Könnte das einer mal mit XE testen ? (Bis Delphi 2010 funktioniert es richtig)

Mich interessiert jetzt einfach die Lösung des Problems, ich denke aber für meine eigentlich eigentliche Anwendung werde ich eher auf einen Nachbau des Win 7 Standarddialoges (mit Optionsauswahl) zurückgreifen

DeddyH 13. Okt 2011 10:33

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mit XE auf Vista Business 32-Bit:

v2afrank 13. Okt 2011 10:38

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dazu der Gegenvergleich mit XE2 unter Vista:

Bummi 13. Okt 2011 10:41

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Ich würde mir eine passendes Formular basteln ....
Eingriffsmöglichkeiten gäbe es schon, allerdings müsste man da auch erst alles benötigte zusammensuchen .... z.B. in der Art wie unten, tut aber nicht das was Du brauchst...

Delphi-Quellcode:
var
  t:TMyThread;
begin
    t:=TMyThread.Create;

  MessageBox(0, Frage, 'Test', MB_ICONWARNING or MB_OK);
 InputBox(Application.Title+' ',Frage,'');
 t.Free;
end;

{ TMyThread }

procedure TMyThread.Execute;
var
  h:Thandle;
begin
  inherited;
  while not Terminated do
    begin
      h := FindWindow(nil,Pchar(Application.Title+' '));
      if h>0 then MoveWindow(h,0,0,400,400,true);
      sleep(50);

    end;
end;

v2afrank 13. Okt 2011 10:42

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Ich denke auch, das basteln eines eigenen Formulars ist leichter. Danke

DeddyH 13. Okt 2011 10:50

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Ich habe mal ein wenig herumprobiert, evtl. mag das als erster Ansatz hilfreich sein:
Delphi-Quellcode:
procedure TForm7.Button1Click(Sender: TObject);
const
  Frage = 'Select the device variant.' + #13#10 + '===============' +
    #13#10#13#10 + '1 - UPS with compact powerblock' + #13#10 +
    ' TempSensors R1.1 / R2.1 / R3.1 on REC - R4.1 / R5.1 / R6.1 on INV' +
    #13#10#13#10 + '2 - UPS with high powerblocks'#13#10 +
    ' TempSensors R1,1 / R1.2 / R2.1 / R2.2 / R3.1 / R3.2 on REC - R4.2 / R5.2 / R6.2 on INV'
    + #13#10#13#10 + '3 - UPS with high powerblocks' + #13#10 +
    ' TempSensors R1.1 / R1.2 / R2.1 / R2.2 / R3.1 / R3.2 on REC - R4.1 / R4.3 / R5.1 / R5.3 / R6.1 / R6.3 on INV'
    + #13#10#13#10;
  XOffset = 10;
  YOffset = 10;
var
  R: TRect;
begin
  R := Rect(XOffset, YOffset, XOffset, YOffset);
  DrawText(Canvas.Handle, Frage, -1, R, DT_LEFT or DT_TOP or DT_CALCRECT);
  ClientWidth := R.Right - R.Left + XOffset * 2; //Offset * 2 für Rand links und rechts, vertikal natürlich genauso, s.u.
  ClientHeight := R.Bottom - R.Top + YOffset * 2 + 50; //50 für den Button, ist natürlich anzupassen
  DrawText(Canvas.Handle, Frage, -1, R, DT_LEFT or DT_TOP);
end;

v2afrank 13. Okt 2011 10:59

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Sieht gut aus. Danke

Bummi 13. Okt 2011 11:02

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Delphi-Quellcode:
Function MyInputQuery(const ACaption, APrompt: string; var Value: string): Boolean;
var
  f:TForm;
  l:TLabel;
  Edit:Tedit;
  bok,bnok:TBitBtn;
begin
  F := TForm.Create(nil);
  l := TLabel.Create(f);
  l.Parent := f;
  l.Align := alTop;
  l.AlignWithMargins := true;
  l.Caption := APrompt;
  l.WordWrap := true;
  f.ClientWidth := l.Width + 20;


  Edit := Tedit.Create(f);
  Edit.Parent := f;
  Edit.Top := l.Top + l.Height + 10;
  Edit.Left := 10;
  Edit.Width := f.ClientWidth - 20;
  Edit.Text := Value;
  f.Caption := Acaption;
  bok := TBitBtn.Create(f);
  bok.Parent := F;
  bok.Caption := 'OK';
  bok.ModalResult := mrok;
  bok.Default := true;
  bnok:= TbitBtn.Create(f);
  bnok.Parent := F;
  bnok.Cancel := true;
  bnok.ModalResult := mrCancel;
  bnok.Caption := 'Abbrechen';
  bok.Top := Edit.Top + Edit.Height + 10;
  bnok.Top := Edit.Top + Edit.Height + 10;
  bok.Left := 10;
  bnok.Left := f.ClientWidth div 2 + 10;
  bok.Width := f.ClientWidth div 2 - 20;
  bnok.Width := f.ClientWidth div 2 - 20;
  f.ClientHeight := bok.Top + bok.Height + 10;
  f.Position := poScreenCenter;
  f.ShowModal;
  Result := F.ModalResult= mrok;
  Value := Edit.Text;
  f.Free;
end;

Luckie 13. Okt 2011 11:53

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Mal was anderes aus der Sicht des Nutzers. Was soll ich denn da jetzt eingeben? Die Ziffer? Oder eine Bezeichnung? Wen nur eine Ziffer, wäre da ein Formular mit drei Optionsfeldern nicht einfacher? oder wenn eine Bezeichnung, wäre es da nicht einfacher eine Combobox oder Listbox mit den ganzen möglichen Bezeichnungen?

v2afrank 13. Okt 2011 12:15

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Danke Bummi,
deine Funktion ist gekauft, auch wenn ich wie auch Luckie schon angemerkt hat auf ein neues Fenster zurückreife was die Funktion für den Anwender einfacher macht (Über eine Art Taskdialog).
Das ganze kam ursprünglich noch aus Doszeiten und da war eben so eine Eingabe 1,2,3 drin.

Jetzt bleibt nur noch das Problem mit dem neuen Verhalte der Inpuboxfunktion unter XE2, dafür mache ich aber lieber einen separaten Thread

DeddyH 13. Okt 2011 12:19

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Zitat:

Zitat von v2afrank (Beitrag 1130240)
Danke Bummi,
deine Funktion ist gekauft

Dann setz aber besser noch einen Ressourcen-Schutzblock (try-finally) ein, gell? ;)

Luckie 13. Okt 2011 12:20

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Zitat:

Zitat von v2afrank (Beitrag 1130240)
Das ganze kam ursprünglich noch aus Doszeiten und da war eben so eine Eingabe 1,2,3 drin.

Dann mach es doch jetzt richtig, wo du schon dabei bist es zu portieren, und nimm Optionsfelder (Radiobuttons).

DeddyH 13. Okt 2011 12:21

AW: Inputbox mit autmatischer Längenanpassung wie Messagebox
 
Oder eine ComboBox, die braucht ggf. weniger Platz.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 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-2025 by Thomas Breitkreuz