[Delphi] Probleem TComboBox

Pagina: 1
Acties:

  • spaceboy
  • Registratie: Februari 2001
  • Laatst online: 17:53

spaceboy

Op grote hoogte

Topicstarter
In een Delphi-applicatie heb ik een combobox:
Afbeeldingslocatie: http://www.euronet.nl/users/tcls/temp/combobox.jpg

Expres is de eerste "entry" leeggelaten. De selectie "geen" is een geldige. Onder Windows 98 en Windows 2000 gaat dit prima, echter in Windows XP Professional gebeurt krijg ik in Debug-mode deze melding:
Afbeeldingslocatie: http://www.euronet.nl/users/tcls/temp/debugger.jpg

Als ik de executable opstart vanuit de explorer krijg ik een soortgelijke fout in die ntdll.dll. Echter kan ik dan wel het programma verder gebruiken, en ook doet de applicatie wat ik wil dat er gebeurt.

HOE KOM IK VAN DIT PROBLEEM AF? :|

Aan bovenstaande tekst kunnen geen rechten worden ontleend. Aan de tekst hieronder wel.


  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 21-08 14:04
Eehm, een numerieke niets is toch een 0? Waarom gebruik je die niet?

Verder is het handig als je even de code van die combobox erbij zet, dan kunnen wij ook zien wat er eventueel fout gaat.

"If you don't know where you are going, any road will take you there"


  • spaceboy
  • Registratie: Februari 2001
  • Laatst online: 17:53

spaceboy

Op grote hoogte

Topicstarter
Het probleem is dat het niet een numerieke niets is. Die cijfers die in de combobox staan kunnen ook letters zijn.
De code erbij zetten is niet zo zinvol denk ik, want het is een spaghetti-code. :) In elk geval zit er alleen een onChange event aanvast waarbij alleen de waarde van de Combobox.ItemIndex in een integer variabele wordt gezet.

En nogmaals: in Windows 2000 werkt hij foutloos. WinXP lijkt een probleem te hebben.

Aan bovenstaande tekst kunnen geen rechten worden ontleend. Aan de tekst hieronder wel.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:12

Tomatoman

Fulltime prutser

Geef de regel code eens waar de exception optreedt. Volgens mij is dit een eenvoudig probleem dat je met een beetje debuggen moet kunnen oplossen.

Een goede grap mag vrienden kosten.


  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 21-08 14:04
Geef dan de code van het onchange event en doe eens een debug stap voor stap en kijk wanneer de exeption optreedt.

"If you don't know where you are going, any road will take you there"


  • spaceboy
  • Registratie: Februari 2001
  • Laatst online: 17:53

spaceboy

Op grote hoogte

Topicstarter
Ik heb nu een breakpoint gezet op de eerste regel code gezet van:
code:
1
2
3
4
5
procedure Tutdmain.cbCodeChange(Sender: TObject);
begin
   iSelected:=cbCode.ItemIndex;
  ...
  ...


Maar zoals ik min of meer verwachtte komt de debugger daar niet eens. Hij knalt al VOORDAT hij die OnChange event aan gaat roepen. En er zitten verder echt geen events gekoppeld aan die combobox. Omdat WinXP als enige een probleem lijkt te hebben lijkt het mij ook niet rechtstreeks aan de code te liggen, maar alle tips blijven welkom.

Aan bovenstaande tekst kunnen geen rechten worden ontleend. Aan de tekst hieronder wel.


  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 21-08 14:04
Hoe en waarmee vul je de combo dan?

"If you don't know where you are going, any road will take you there"


  • spaceboy
  • Registratie: Februari 2001
  • Laatst online: 17:53

spaceboy

Op grote hoogte

Topicstarter
THEF_Pino schreef op 04 October 2003 @ 17:36:
Hoe en waarmee vul je de combo dan?
Op dit moment vul ik 'm met een aantal cijfers, wat dus ook letters kunnen worden, maar voorlopig zit dat zo:

code:
1
2
   cbCode.Items.Add('');
   for iLoop:=1 to iNrCodes do cbCode.Items.Add(inttostr(iLoop));


Maar of dat echt relevant voor 't probleem is weet ik niet...

Aan bovenstaande tekst kunnen geen rechten worden ontleend. Aan de tekst hieronder wel.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Als je niets wilt geselecteerd hebben in een Combobox , dan kan je IMO beter de OnKeyDown event overriden, en daar checken of er bv op delete of backspace gedrukt werd.
Indien dit het geval was, dan ga je de selectie leegmaken. Dit kan je doen door de ItemIndex property op -1 te zetten.
Dit is een mooiere oplossing imo dan met een 'lege' waarde spelen:

code:
1
2
3
if Ord(Key) in [VK_BACK, VK_DELETE] then begin
  MyComboBox.ItemIndex := -1;
end;

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Dit is een bekende bug van D7. De combobox stikt soms in een lege regel. Zie http://qc.borland.com/wc/wc.exe/details?ReportID=2246

Als je durft kan je de VCL aanpassen. Dit is de goede code in StdCtrls.pas
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
function TCustomComboBoxStrings.Get(Index: Integer): string;
var
  Len: Integer;
begin
  Len := SendMessage(ComboBox.Handle, CB_GETLBTEXTLEN, Index, 0);
  if (Len <> CB_ERR) {solution: also test for zero length} and (Len <> 0) then
  begin
    SetLength(Result, Len);
    SendMessage(ComboBox.Handle, CB_GETLBTEXT, Index, Longint(PChar(Result)));
  end
  else
    SetLength(Result, 0);
end;

Pas op! Dit werkt niet met runtime packages. Een oplossing die altijd werkt kan je hier vinden: http://codecentral.borlan...cweb.exe/listing?id=18872 en werkt door runtime in de VCL te gaan zitten hacken.

/edit
Of gewoon geen lege regel gebruiken natuurlijk :) Zie whoami's tip

[ Voor 6% gewijzigd door LordLarry op 04-10-2003 19:30 ]

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


  • klinz
  • Registratie: Maart 2002
  • Laatst online: 10-08 15:44

klinz

weet van NIETS

Een andere oplossing voor dit probleem was geloof ik om er alleen een spatie in te zetten.

  • spaceboy
  • Registratie: Februari 2001
  • Laatst online: 17:53

spaceboy

Op grote hoogte

Topicstarter
Ah, bedankt iedereen. Die tip van whoami ziet er netjes uit, maar heb uit makkelijkheid-overweging de tip van klinz gebruikt, gewoon vullen met spatie werkt ook foutloos. Thanks anyway!

Aan bovenstaande tekst kunnen geen rechten worden ontleend. Aan de tekst hieronder wel.

Pagina: 1