Toon posts:

[Delphi] Probleem met instellen van invoer rect van TEdit

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een TEdit met aan de rechterkant een SpeedButton (zit dus in de TEdit).

Het is natuurlijk de bedoeling dat het invoer gedeelte van de TEdit beperkt wordt tot aan de linker kant van de SpeedButton. Dit werkte altijd goed, totdat ik van de TEdit geen multiline control maakte.

code:
1
2
3
4
5
6
procedure TAlignEdit.CreateParams(var Params: TCreateParams);
const Alignments: array[TAlignment] of Longint = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or Alignments[FAlignment] or WS_CLIPCHILDREN;
end;


En het instellen van het bereik:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TAlignEdit.SetEditRect;
var Loc: TRect;
begin
  if Parent = nil then
    Exit;
  SendMessage(Handle, EM_GETRECT, 0, LongInt(@Loc));
  Loc.Bottom := ClientHeight + 1;
  Loc.Right := ClientWidth - FButtonWidth - 2;
  Loc.Top := 0;
  Loc.Left := 0;
  SendMessage(Handle, EM_SETRECTNP, 0, LongInt(@Loc));
  SendMessage(Handle, EM_GETRECT, 0, LongInt(@Loc));
end;


Doordat ik ES_MULTILINE heb weg gehaald in de Params.Style wordt de tekst nu weergegeven tot aan de rechterkant van de SpeedButton (en dus niet meer tot de linkerkant, wat zou moeten).

ES_MULTILINE is toch niet verplicht? (en of ES_MULTILINE staat ingesteld, wordt voor de rest ook nergens gecontroleerd in de code van dit component)

Is hier een oplossing voor?

  • Glival
  • Registratie: December 1999
  • Laatst online: 31-08 13:26
Ik heb ook eens zo'n buttonedit-component gemaakt, ik heb toen gewoon een TEdit en een TSpeedButton op een TPanel gezet :)

Verwijderd

Topicstarter
Glival schreef op 22 augustus 2002 @ 15:35:
Ik heb ook eens zo'n buttonedit-component gemaakt, ik heb toen gewoon een TEdit en een TSpeedButton op een TPanel gezet :)
Ja wat wil je hiermee zeggen :?

  • Glival
  • Registratie: December 1999
  • Laatst online: 31-08 13:26
Verwijderd schreef op 22 augustus 2002 @ 15:55:
[...]

Ja wat wil je hiermee zeggen :?
Nou... zo kan het dus ook, en is het misschien wat makkelijker...

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

ik heb toen gewoon een TEdit en een TSpeedButton op een TPanel gezet
Dat is alleen in XP geen gezicht, want dan kan theming niet goed toegepast worden.

topicstarter: denk je niet dat het beter is om de speedbutton gewoon naast de edit te zetten? scheelt een hoop moeite en is vindt ik veel logischer. een speedbutton is immers geen onderdeel van een editbaar stukkie tekst :)

日本!🎌


Verwijderd

Topicstarter
Nee ik moet geen Edit en Button apart hebben. De button moet in het Edit component staan.
_Thanatos_ schreef op 22 augustus 2002 @ 16:16:
topicstarter: denk je niet dat het beter is om de speedbutton gewoon naast de edit te zetten? scheelt een hoop moeite en is vindt ik veel logischer. een speedbutton is immers geen onderdeel van een editbaar stukkie tekst :)
Ik vind dat die er wel in hoort te staan. (Bij een combobox staat het pijlte toch ook in de Edit box ;) )

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Hij staat er naast, er is alleen getekent alsof ie er in staat

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry schreef op 22 augustus 2002 @ 16:55:
Hij staat er naast, er is alleen getekent alsof ie er in staat
Oh ik dacht dat die er in stond, maar goed dat maakt niet uit.


Maar ik heb het inmiddels opgelost. Het blijkt dat het instellen van het edit gedeelte alleen werkt als de Style ES_MULTILINE is. Waarom.......????? (Ja, microsoft heeft het ontworpen |:( Zo zijn er nog een aantal vreemde componenten: DateTimePicker kan standaard geen weeknummers tonen, je kan geen lege datum weergeven en dat die tegelijktijd editable is, enz....).

Ik heb hem nu gewoon op ES_MULTILINE staan en ik heb er voor gezorgd dat de gebruiker niet meerdere regels kan invoeren.

Een ander probleem is bij ES_MULTILINE dat de property AutoSelect niet werkt. Dus daarvoor heb ik weer een CM_ENTER toegevoegd en daarin zorg ik er voor dat die wel alles selecteert (afhankelijk van AutoSelect).

Beetje rare constructie misschien, maar het werkt en een andere mogelijkheid is er volgens mij niet.
Pagina: 1