Avatar billede esneh Nybegynder
17. oktober 2008 - 22:30 Der er 20 kommentarer

Smartere måde at vælge hvordan Tlabel skal se ud

Halløj,

Jeg vil gerne lave et label hvor man kun kan skriv tallene fra 1 til 9, er der ikke en smarter måde at gøre det på end med kommandoen "or"?
Avatar billede kroning Nybegynder
18. oktober 2008 - 00:20 #1
Du kan bruge "and"
Avatar billede esneh Nybegynder
18. oktober 2008 - 00:23 #2
Tænkte mere i noget alla stil med ['0'..'9'] Ligesom når man kun skal kunne skrive tal i en tekstbox
Avatar billede js_delphi Nybegynder
18. oktober 2008 - 00:24 #3
Jeg har ikke forstaaet spoergsmaalet. Skrive tal med en TLabel??
Avatar billede esneh Nybegynder
18. oktober 2008 - 00:34 #4
Lad mig om formulere.
Hvis nu jeg har en TLabel, og den indeholder et tal fra 0-9, så skal den i dens caption sætte et 0 foran.
Avatar billede js_delphi Nybegynder
18. oktober 2008 - 01:49 #5
Hvis du mener at 1 skal vises som 01, saa se paa funktionen Format. 
Kan lave et eksempel i morgen, hvis det skulle vaere noedvendigt.

Godnat.
Avatar billede kroning Nybegynder
18. oktober 2008 - 04:15 #6
Label.Caption:='0'+Label.Caption;
Avatar billede mbsnet Nybegynder
18. oktober 2008 - 07:49 #7
function addDigitsStr(const aNumb:string;aDigits:byte=2):string;
var ln:integer;p,rp:pChar;
begin ln:=length(aNumb);if aDigits<ln then begin result:=aNumb;exit end;
setLength(result,aDigits);p:=pChar(aNumb)+(ln-1);rp:=pChar(result)+(aDigits-1);
while (aDigits>0) and (p^<>#0) do begin rp^:=p^;dec(aDigits);dec(rp);dec(p) end;
while aDigits>0 do begin rp^:='0';dec(aDigits);dec(rp) end
end;

function addDigits(const numb:int64;const digits:byte=2):string;
begin result:=addDigitsStr(intToStr(numb),digits) end;

//brug eksempel: label1.caption:=addDigits(12345,16);
//mbs
Avatar billede hrc Mester
18. oktober 2008 - 10:15 #8
Det var noget besværligt var det ikke? Denne lille funktion kan løse det.

function AddChars(const aChar: char; const aLength: integer): string;
begin
  result := '';
  while length(result) < aLength do
    result := result + aChar;
end;

Label1.Caption := AddChars('0',3) + IntToStr(Value);
Avatar billede mbsnet Nybegynder
18. oktober 2008 - 10:50 #9
Besværligt at lave, men ikke at bruge :-) Den er også hurtigere at bruge hvis man bruger den meget.
Avatar billede esneh Nybegynder
18. oktober 2008 - 11:57 #10
js_delphi, Du må også gerne komme med et bud
Avatar billede hrc Mester
18. oktober 2008 - 20:46 #11
Skal det gå hurtigt kan I bruge denne her. Det er så sæt på BASM som man kan komme (uden at gøre det selv)

function FillString(const aChar: char; const aLength: integer): string;
begin
  SetLength(Result,aLength);
  FillChar(Result[1],length(Result),aChar);
end;
Avatar billede hrc Mester
18. oktober 2008 - 20:58 #12
Ikke "sæt", men "tæt" på..

I øvrigt burde man måske tjekke parametrene, men så skulle jeg bruge flere linjer.

Lidt statistik:

På min bærebare (2Ghz Mobile) tog det 32ms at lave en streng på 10 mio. tegn.

Det samme gjorde mbsnet's løsning - men nærlæst er den unødig kompliceret.

Min initielle løsning, må jeg bekende, tog sendrægtige 1048ms.
Avatar billede esneh Nybegynder
18. oktober 2008 - 20:58 #13
hrc, kan jeg få en forklaring omkring hvordan koden fungere?
Avatar billede hrc Mester
18. oktober 2008 - 21:01 #14
Nu kan jeg ikke stoppe:

Prøvede lige denne variant:

function FillString2(const aChar: char; const aLength: integer): string;
var
  i: integer;
begin
  SetLength(Result,aLength);
  for i := 1 to aLength do
    Result[i] := aChar;
end;

og den tog 147ms. FillChar er ret optimal.
Avatar billede hrc Mester
18. oktober 2008 - 21:12 #15
Hej esneh. Er du heller ikke faldet for vores "public service"-kanalers lørdagstilbud (dvs. jeg må ikke se Stjernekrigen (igen) for konen).

FillString2 er lidt en forklaring i sig selv.

SetLength sætter længden på strengen en gang for alle. Fra gammel tid var St[0] = strengens længde (hvilket begrænsede den til 256 tegn). I dag er den maksimale længde 2Gb men der er stadig "noget" foran strengens første tegn.

FillChar fylder et antal strenge ind i en array - og sådan er en streng jo: En array af tegn.

Kommandoen "FillChar(st[1],length(st),'0');" betyder at der strengen fyldes med nuller.

Jeg søgte lidt på nettet - for jeg vidste der var en funktion der allerede gjorde det (http://www.delphibasics.co.uk/RTL.asp?Name=FillChar). Kommandoen hedder StringOfChar og nedenstående er løsningen der slår alle:

function FillString3(const aChar: char; const aLength: integer): string;
begin
  result := StringOfChar(aChar,aLength);
end;

Grunden til jeg pakkede den ind i en funktion er for at kunne teste hastigheden:

function FillString3(const aChar: char; const aLength: integer): string;
var
  TickStart: Cardinal;
begin
  TickStart := GetTickCount;
  try
    result := StringOfChar(aChar,aLength);
  finally
    OutputDebugString(pchar(format('Det tog: %d ms',[GetTickCount - TickStart + 1])));
  end;
end;
Avatar billede hrc Mester
18. oktober 2008 - 21:15 #16
Åhh ja. FillString3 tog kun 17ms for at fylde en streng på 10mio. tegn. Desuden er den nok også unicode-sikker, dvs. den kan håndtere at et tegn fylder 2 bytes.
Avatar billede esneh Nybegynder
18. oktober 2008 - 22:33 #17
Ok, Takker ^^ vil give mig i kast med det du har skrevet
Avatar billede js_delphi Nybegynder
19. oktober 2008 - 00:58 #18
Label1.Caption := Format('%.2d', [SpinEdit1.Value]);
Avatar billede falster Ekspert
20. oktober 2008 - 23:00 #19
Måske kan man også få noget ud af at studere kildekoden i Poul Baks PBNumEdit.

http://bak-o-soft.dk/Default.asp?Page=PBEditPack
Avatar billede hrc Mester
21. oktober 2008 - 01:25 #20
js_delphi: Naturligvis var der format-kommandoen, faktisk bruger jeg det overalt i mine programmer. Tror jeg alligevel glemte kommandoen da snakken gik over i hvilken rutine der var mest effektiv - men øv, at jeg glemte den!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester