Avatar billede hclarsen Nybegynder
22. juli 2005 - 15:17 Der er 61 kommentarer og
1 løsning

Radiobuttons og caption

Hvordan opretter jeg en variabel, som finder captionen til den radiobutton der ud af X radiobuttons er checked?
Avatar billede martinlind Nybegynder
22. juli 2005 - 15:23 #1
hvis det er en radiogroup du har så kan du bruge ItemIndex, ellers kan du løbe controls[] arrayet igennem og checke om det er en radiobutton og der efter om den er checked
Avatar billede hclarsen Nybegynder
22. juli 2005 - 15:33 #2
Faktisk er det en popupmenu jeg bruger, men har sat Menuitems'ne til at være Radioitems
Avatar billede martinlind Nybegynder
22. juli 2005 - 15:40 #3
så kan du vel løbe dine items på menuen igennem og checke om det er checked
Avatar billede hclarsen Nybegynder
22. juli 2005 - 17:20 #4
Jeg kunne selvfølgelig altid få en timer til at tjekke alle X Radiobuttons hver for sig, men er der en nemmere måde? Den jeg taler om er bare en if-then-else løkke for alle X buttons, men er der en smartere måde?
Avatar billede martinlind Nybegynder
22. juli 2005 - 17:34 #5
Du kan ikke bare gøre noget i en event, der må da være en event der bliver fyret af når du checker/unchecker din radiobutton
Avatar billede kroning Nybegynder
22. juli 2005 - 17:40 #6
Lav en OnClick event og sæt alle Menuitems til at pege på den, i denne event kan du så sætte din variabel til captionen på den Menuitem der er trykket på.
Avatar billede hclarsen Nybegynder
22. juli 2005 - 18:17 #7
>>Lav en OnClick event og sæt alle Menuitems til at pege på den, i denne event kan du så sætte din variabel til captionen på den Menuitem der er trykket på.

Mit problem i dette tilfælde er, at jeg samtidig viser programmets uptime sammen med denne event, og ved en tryk på menuitem'et bliver uptimen ikke opdateret.
Avatar billede kroning Nybegynder
22. juli 2005 - 18:25 #8
Hvad er problemet med at opdatere uptimen i samme event.
Avatar billede hclarsen Nybegynder
22. juli 2005 - 18:35 #9
Ok, hvordan kan jeg gøre det?
Avatar billede kroning Nybegynder
22. juli 2005 - 19:00 #10
Hvordan opdatere du uptime? Og hvad bruger du den til, er det bare er værdi for hvor længe programmet har kørt?
Avatar billede hclarsen Nybegynder
22. juli 2005 - 19:02 #11
Ja, min kode ser således ud:

var
tid: ttime;

begin
  tid:= time;
  label1.caption := timetostr(time-tid);
end;
Avatar billede kroning Nybegynder
22. juli 2005 - 19:21 #12
Og hvorfor kan du ikke putte den kode ind i OnClick eventen?
Avatar billede hclarsen Nybegynder
22. juli 2005 - 19:31 #13
det skal opdateres løbende, men hvis det indsættes i OnClick-eventen opdateres det da kun ved hvert klik?
Avatar billede kroning Nybegynder
22. juli 2005 - 20:31 #14
Men hvor har du koden nu til uptime?
Avatar billede hclarsen Nybegynder
22. juli 2005 - 20:53 #15
den har jeg i en timer, og det virker, men det er fordi (eksempel), når jeg trykker på radiobutton1, så skal label1.caption := 'Du har nu trykket på RB1, og uptime er' + timetostr(time-tid); // men her opdateres uptime jo kun, når jeg trykker på Radiobutton1, og ikke løbende når den er checked.
Avatar billede kroning Nybegynder
22. juli 2005 - 21:27 #16
Kan du så ikke fortsætte med at bruger en timer til uptime og så i OnClick til radiobutton kan du sætte en variabel som du bruger i din Timer event f.eks.:

I din OnClick event:
RBcaption:=(Sender as TMenuItem).Caption;

Og i din timer event:
label1.caption:='Du har nu trykket på '+RBcaption+', og uptime er' + timetostr(time-tid);
Avatar billede hclarsen Nybegynder
22. juli 2005 - 21:38 #17
Sådan som jeg ser det, gælder det kun for RBcaption, og ikke alle X? Sådan er det også, når jeg prøver det
Avatar billede kroning Nybegynder
22. juli 2005 - 22:12 #18
RBcaption er en variabel af typen string:

var
  RBcaption : string;

Du har vel sat OnClick eventen på alle dine Radiobuttons?
Avatar billede hclarsen Nybegynder
22. juli 2005 - 22:35 #19
Ok, nu ser det ud til at virke.. tak for hjælpen. Men hvorfor er der en _ foran det første bogstav for RBCaption?
Avatar billede kroning Nybegynder
22. juli 2005 - 22:39 #20
Du må jo have sat en _ foran din caption i din Radiobuton.caption.
Avatar billede kroning Nybegynder
22. juli 2005 - 22:42 #21
Er du sikker på at den er foran og ikke under, prøv at sætte ShowAccelChar=false på din Label1.
Avatar billede hclarsen Nybegynder
22. juli 2005 - 22:45 #22
Ja, det er mig der vrøvler...tak; læg gerne et svar.
Avatar billede hclarsen Nybegynder
22. juli 2005 - 22:47 #23
- nu står der minsandten et '&' foran min streng?
Avatar billede kroning Nybegynder
22. juli 2005 - 22:48 #24
Der er en der har lagt et svar og det er fint med mig, jeg kom jo bare her og blandede mig :-)
Avatar billede kroning Nybegynder
22. juli 2005 - 22:50 #25
Det er fordi du har et '&' i din caption på din radiobutton, den må du så manuelt fjerne.
Avatar billede kroning Nybegynder
22. juli 2005 - 22:51 #26
F.eks. (utestet)
RBcaption:=(Sender as TMenuItem).Caption;
if pos('&',RBcaption)>0 then
Delete(RBcaption,pos('&',RBcaption),1);
Avatar billede hclarsen Nybegynder
22. juli 2005 - 22:51 #27
Ok, men et tak skal det da lyde alligevel herfra

- mht. '&', har står det ikke foran nogle af mine RB's, men forekommer alligevel ved dem alle?
Avatar billede kroning Nybegynder
22. juli 2005 - 22:59 #28
Ok det er så fordi at AutoHotKeys for din menu er sat til maAutomatic, men koden

RBcaption:=(Sender as TMenuItem).Caption;
if pos('&',RBcaption)>0 then
Delete(RBcaption,pos('&',RBcaption),1);

burde kunne ordne det problem.
Avatar billede hclarsen Nybegynder
23. juli 2005 - 00:06 #29
Mht min uptime, har jeg lige erfaret, at det ikke virker efter 00:00.. er der en måde at vise mit programs uptime på, som også sikrer mig mod sådanne fejl?
Avatar billede martinlind Nybegynder
23. juli 2005 - 00:33 #30
Ja, du kan få en meget nøjagtig uptime, men så skal du ind og ha' fat i den process handle så kan du bruge windows kald til at få din uptime. en lidt større hitorie, så hvis du er newbee, er det nok lidt "svært"
Avatar billede martinlind Nybegynder
23. juli 2005 - 00:33 #31
øhh, det var da ikke mig der skulle ha' point var det ??
Avatar billede hclarsen Nybegynder
23. juli 2005 - 00:41 #32
Jeg ville også give dem til kroning, men han var beskeden og overlod dem til dig. Hvordan kan jeg finde mit programs uptime uden at det skal være helt præcist?
Avatar billede martinlind Nybegynder
23. juli 2005 - 01:03 #33
Du kunne f.eks. gemme start tidspunket i en TDatetime var som du sætter når du starter det og KUN når du starter, så burde du kunne bruge, delphi's TDatetime er skuet sådan sammen at man skulle kune bruge -+ til at regne på den

now-prgStart

eller findes der også nogle timebetween func. du kan se i dateutils unit'en, mener jeg den hedder.
Avatar billede hclarsen Nybegynder
23. juli 2005 - 01:10 #34
now-prgStart fungerer ikke helt, fordi hvis nu kl. er 00:15 og jeg startede 23:45, så er den gal
Avatar billede kroning Nybegynder
23. juli 2005 - 08:31 #35
Vil du kun have antal timer dvs. tttt:mm:ss, eller skal der vises år, måneder og dage hvis uptime skulle blive så lang?
Avatar billede hclarsen Nybegynder
23. juli 2005 - 12:55 #36
>>Vil du kun have antal timer dvs. tttt:mm:ss, eller skal der vises år, måneder og dage hvis uptime skulle blive så lang?

Bare det normale HH:MM:SS ´vil være helt fint
Avatar billede kroning Nybegynder
23. juli 2005 - 13:02 #37
Dvs at hvis der har været et uptime på lidt over 2 døgn så skal den f.eks. skrive:
51:12:48
Avatar billede hclarsen Nybegynder
23. juli 2005 - 13:03 #38
Det er helt korrekt
Avatar billede kroning Nybegynder
23. juli 2005 - 13:04 #39
Har du DateUtils uniten? Hvis du ikke har er det nemlig lidt bøvligere.
Avatar billede hclarsen Nybegynder
23. juli 2005 - 13:06 #40
nej, desværre, men er den til at hente noglesteder?
Avatar billede kroning Nybegynder
23. juli 2005 - 13:07 #41
Dvs. du bruger Delphi 4 eller 5?
Avatar billede hclarsen Nybegynder
23. juli 2005 - 13:08 #42
Delphi 5
Avatar billede kroning Nybegynder
23. juli 2005 - 13:23 #43
Når programmet starter sætter du prgStart, prgStart skal være af typen TDateTime:

var
  prgStart : TDateTime;
begin
  prgStart:=Now;
end;
------------

Uptime får du sådan her:
Label1.Caption:=IntToStr(Trunc(Now-prgStart)*24)+formatdatetime(':nn:ss',Frac(Now-prgStart));
Avatar billede martinlind Nybegynder
23. juli 2005 - 13:36 #44
now-prgStart virker fint, det er bare dage også, og ikke som du vil ha' det :)
Avatar billede kroning Nybegynder
23. juli 2005 - 13:46 #45
Hvad mener du?
Avatar billede hclarsen Nybegynder
23. juli 2005 - 14:01 #46
Hmm.. kunne jeg ikke oprette en integer I, som ved FormCreate var i:=0, og derefter satte en timer til at i:= i+1; ? Men det kræver vel, at jeg laver noget, hvor det skifter ved 60, og igen ved 60?
Avatar billede kroning Nybegynder
23. juli 2005 - 14:06 #47
Virker mit forslag da ikke?
Avatar billede hclarsen Nybegynder
23. juli 2005 - 14:07 #48
Nej, synes ikke at kunne få det til at virke. Der står bare 0:00:00
Avatar billede kroning Nybegynder
23. juli 2005 - 14:16 #49
Det virker fint her, du opdatere vel din Label ca. hver sekund? Og sætter kun prgStart=now een gang ved opstart af program?
Avatar billede hclarsen Nybegynder
23. juli 2005 - 14:24 #50
Det var hvad jeg havde gjort, men genstartede lige, og prøvede igen, og nu virker det. Vil du forklare koden for mig?
Avatar billede hclarsen Nybegynder
23. juli 2005 - 15:17 #51
- den laver stadig den samme fejl. Hvis jeg strter programmet 23:59:50, bliver klokken af gode grunde efter 10 sek 00:00, og der er det at uptimen bliver mærkelig.
Avatar billede kroning Nybegynder
23. juli 2005 - 16:29 #52
Det har jeg ingen problemer med her, du har defineret prgStart til at være en TDateTime og ikke kun en TTime?
Avatar billede kroning Nybegynder
23. juli 2005 - 16:32 #53
Glem det TTime og TDateTime er jo det samme.
Avatar billede kroning Nybegynder
23. juli 2005 - 16:33 #54
Du bliver nok nød til at poste noget kode for som sagt virker det fint her også hvis jeg starter programmet kl. 23:59:50.
Avatar billede hclarsen Nybegynder
23. juli 2005 - 17:11 #55
var
Tid: TDateTime;

i FormCreate
begin
  Tid := now;

I timer
begin
  Label1.Caption := 'Programmet har været oppe i ' + IntToStr(Trunc(Now-prgStart)*24)+formatdatetime(':nn:ss',Frac(Now-prgStart));
Avatar billede kroning Nybegynder
23. juli 2005 - 17:22 #56
I FormCreate sætter du en Tid:=now men i timer bruger du prgStart?
Avatar billede hclarsen Nybegynder
23. juli 2005 - 21:20 #57
Hov, det er mig der har glemt at rette i koden da jeg skrev den herind. Koden virker, men giver stadigvæk en forkert uptime idet tiden skifter til 00:00
Avatar billede kroning Nybegynder
24. juli 2005 - 07:55 #58
Jeg kan kun sige at der må være noget galt i din kode for her foregår et skift til 00:00 uden problemer. Prøv at lave et lille test program hvor du kun har en label en timer og de par linier kode jeg foreslog.
Dvs.:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
      prgStart : TDateTime;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
    prgStart:=Now;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    Label1.Caption:=IntToStr(Trunc(Now-prgStart)*24)+formatdatetime(':nn:ss',Frac(Now-prgStart));
end;

end.
Avatar billede hclarsen Nybegynder
24. juli 2005 - 11:56 #59
Ok, det virker i test-programmet, og det er jo rart. Mht det 'egentlige' program virker det ikke, og så vidt jeg kan se er koden identisk, så jeg ved ikke hvor fejlen ligger, men det virker ihvertfald! Er det muligt du kan forklare koden for mig?
Avatar billede kroning Nybegynder
24. juli 2005 - 16:52 #60
Denne linie eller det hele?
IntToStr(Trunc(Now-prgStart)*24)+formatdatetime(':nn:ss',Frac(Now-prgStart));
Avatar billede hclarsen Nybegynder
24. juli 2005 - 17:24 #61
Kun den linie. Kan godt se princippet i det, men ikke hvorfor du skelner mellem timerne og minutter,sekunder, og hvad de andre udtryk er for noget. Jeg har vist også plaget dig nok med dette problem, så jeg så meget gerne, at du oprettede et svar i en ny tråd som jeg opretter senere, så kan du få dine velfortjente point!
Avatar billede kroning Nybegynder
24. juli 2005 - 17:48 #62
Først lidt om TDateTime typen som er en Double dvs. den kan have værdier mellem 5.0 x 10^-324 .. 1.7 x 10^308.
TDateTime er blot et tal der fortæller hvor mange dage der er gået siden 12/30/1899. Tallet før komma angiver antallet af dage og tallet efter komma angiver delen af 24 timer. Dvs. vil man forøge datoen med 5 dage ligger man blot 5 til, vil man forøge datoen med 12 timer ligger man 0.5 til.

Den første del:
IntToStr(Trunc(Now-prgStart)*24)
Trunc angiver heltallet før komma, dvs. Trunc(5.67) er 5, så det jeg får med Trunc(Now-prgStart) er antallet af dage som jeg så ganger med 24 for at få antal timer.

Den anden del:
formatdatetime(':nn:ss',Frac(Now-prgStart));
Frac angiver tallet efter komma, dvs. Frac(5.67) er 0.67, så det jeg får med Frac(Now-prgStart) er altså delen af 24 timer.
Formatdatetime er en function der konvertere en TDateTime til en streng, nn giver minutter og ss giver sekunder.

Håber du kan bruge det til lidt.
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