Results 1 to 12 of 12

Thread: code controle

  1. #1
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127

    Question code controle

    Ik plaats ook deze maar even in de coffee corner, dit omdat ik vindt dat deze vraag
    niets toevoegd aan de vraagbaak.
    Wie kan mij vertellen of het 2e case statement in geval van een error ook wordt
    uitgevoerd.
    Dit is namelijk niet te testen want ik kan deze error's niet simuleren.

    Dus als iemand even zijn of haar mening wil geven bedankt.

    Code:
    procedure TfScannerInlezen.Formula1ErrorEvent(Sender: TObject; ResultCode,
      ResultCodeExtended, ErrorLocus: Integer; var ErrorResponse: Integer);
    var
      Msg: string;
    begin
      case Formula1.ResultCode of
        FormulaSuccess: Msg := 'Operation Completed Succesfully'; {0}
        FormulaErrorClosed: Msg := 'Device is closed'; {101}
        FormulaErrorClaimed: Msg := 'Device is blocked'; {102}
        FormulaErrorNotClaimed: Msg := 'Device does not have exclusive access'; {103}
        FormulaErrorNoService: Msg := 'Requested service does not exists'; {104}
        FormulaErrorDisabled: Msg := 'Device disabled'; {105}
        FormulaErrorIllegal: Msg := 'Invalid operation'; {106}
        FormulaErrorNoHardware: Msg := 'Device requested does not exists or cannot be used'; {107}
        FormulaErrorOffline: Msg := 'Device off-line'; {108}
        FormulaErrorNoExist: Msg := 'Device does not exists'; {109}
        FormulaErrorExists: Msg := 'Device allready exists'; {110}
        FormulaErrorFailure: Msg := 'Operation not succesfully carried out'; {111}
        FormulaErrorTimeout: Msg := 'Maximum operation time exceeded'; {112}
        FormulaErrorBusy: Msg := 'Device busy'; {113}
        FormulaErrorExtended: Msg := 'Extended error in checking the property ResultCodeExtended'; {114}
      end;
        //FormulaErrorExtended:
      case Formula1.ResultCodeExtended of
        FormulaErrorExtendedAddress: Msg := 'Invalid address'; {201}
        FormulaErrorExtendedFileOpened: Msg := 'Device''s file invalid or in use'; {202}
        FormulaErrorExtendedNotOpen: Msg := 'Device''s file was not opened'; {203}
        FormulaErrorExtendedMemoryFull: Msg := 'Device''s memory full'; {204}
        FormulaErrorExtendedRAM: Msg := 'RAM error in device'; {205}
        FormulaErrorExtendedEEPROM: Msg := 'EEPROM error in device'; {206}
        FormulaErrorExtendedRAMEEPROM: Msg := 'RAM and EEPROM error in device'; {207}
        FormulaErrorExtendedPolling: Msg := 'Device''s polling inactive'; {208}
            //else Msg := 'Extended error in checking the property ResultCodeExtended'; {114}
      end;
      //end;
      Memo1.Lines.Add('Error : ' + Msg + ' , ' + TimeToStr(Now));
      Sb.Panels[5].Text := Msg;
      Sb.Update;
    end;

    Richard
    RLD

  2. #2
    Dat hangt er vanaf wat je met een error bedoelt. Een error in de zin van bijvoorbeeld FormulaErrorNoService, dan is het antwoord Ja, een error in de zin van een exception die optreedt bij het eerste case statement dan is het antwoord Nee.

    Overigens kun je dit soort dingen testen door een fout te simuleren:
    Code:
    var
      Msg: string;
      SimulatieFout: integer;
    begin
      SimulatieFout := FormulaErrorClaimed;
      case SimulatieFout of
        FormulaSuccess: Msg := 'Operation Completed Succesfully'; {0}
        FormulaErrorClosed: Msg := 'Device is closed'; {101}
        FormulaErrorClaimed: Msg := 'Device is blocked'; {102}
    
    Marcel

  3. #3
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127
    Marcel,

    Het ging mij inderdaad om het eerste, dus als er een error door het object optreed.
    Deze procedure is een error event vanuit het object zelf dus, ik zou verwachten
    dat als er een error optreed van het het type "ResultCodeExtended" dat deze
    dan netjes via het bijbehorende case statement er uitgehaald wordt, en dan in de
    showmessage getoond wordt.

    Maar goed, dat is inderdaad wel even het proberen waard.

    In zoverre bedankt.

    Richard
    RLD

  4. #4
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127

    Talking Snelheid verbetering gewenst.

    Goedenmorgen iedereen,

    Hier weer een draadje in de coffee corner omdat ik van coffee houd en omdat ik denk
    dat niet veel aan de vraagbaak toevoegd.

    Weet iemand mischien of deze tot nu toe nog 'test' code is te optimaliseren ?
    Het moet een routine worden die een lijst met random getallen genereerd die
    'uniek' zijn, dus maar 1 maar voorkomend
    Nu heb ik het getest op een Intel Celeron 500Mhz. met 128 meg, en het valt mij
    een beetje tegen, mischien dat ik een vreselijk stomme fout maak maar ik zie e'm
    even niet.

    En mischien dat het wel veeeel simpeler kan.

    Alvast bedankt.

    Richard

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
      vList: TStringList;
    implementation
    
    {$R *.DFM}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      vList := TStringList.Create;
    end;
    
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      vList.Free;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject); {genereer een random list}
    const
      Tracks: Integer = 600;
    var
      RandomNumber: Extended;
      ListCounter: Integer;
      ItemCounter: Integer;
      Found: Boolean;
      StartTime, StopTime, ProcessTime: TDateTime;
    begin
      try
        Screen.Cursor := crHourGlass;
        Randomize;
        vList.Clear;
        ItemCounter := 0;
        StartTime := Now;
        while vList.Count < Tracks do
          begin
            ListCounter := 0;
            Found := False;
            RandomNumber := Random(Tracks);
            if vList.Count = 0 then vList.Add(FloatToStr(RandomNumber));
            while ListCounter < vList.Count do
              begin
                Inc(ListCounter);
                if vList.Strings[ListCounter - 1] = FloatToStr(RandomNumber) then
                  begin
                    Found := True;
                  end;
              end;
            if not Found then vList.Add(FloatToStr(RandomNumber));
            Inc(ItemCounter);
          end;
      finally
        StopTime := Now;
        ProcessTime := StopTime - StartTime;
        Screen.Cursor := crDefault;
        ShowMessage('List with '+ IntToStr(Tracks) + ' numbers generated in : ' + timetostr(ProcessTime)) ;
      end;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    var
      LstNr: Integer;
    begin
      Memo1.Clear;
      LstNr := 0;
      while LstNr < vList.Count do
        begin
          Inc(LstNr);
          Memo1.Lines.Add(vList.Strings[lstnr - 1]);
        end;
    end;
    end.
    RLD

  5. #5
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Mijn standaard truuk voor het genereren van een unieke lijst met random nummers zonder dubbele loop (wat afgrijselijk veel tijd kan vreten):


    - Maak een array ter grootte van het aantal nummers wat je wilt
    - Vul deze lijst van begin-eind getal, 1e item is begingetal, 2e is begingetal+1, enz. In feite een gesorteerde lijst met alle mogelijke nummers dus.
    - Gebruik een for-loop (geen while, je weet immers hoeveel getallen je wilt dus een for-loop is sneller) om van 0-(aantal getallen-1) te loopen. In elke loop:
    - Maak een random nummer van 0-array.count, haal het item uit de array en verwijder deze uit de lijst (hierdoor kan dat getal dus nooit meer voorkomen in je uiteindelijke random list)


    Voila, een lijst met unieke random nummers binnen no-time.

    Aangezien ik me toch zwaar verveel, hier even een stukje code:


    Code:
    type
      // Somehow, this was necessary to make it work...
    TIntegerArray = array of Integer;
    
    procedure GenUniqueRndNumbers(const AStart, AEnd: Integer; var AResult: TIntegerArray);
    var
      aTemp:    array of Integer;
      iLoop:    Integer;
      iSize:    Integer;
      iRnd:     Integer;
    
    begin
      Randomize();
    
      // Must be a real wanker to do this kind of stuff...
    if AStart > AEnd then
        exit;
    
      // Set up arrays
    iSize := AEnd - AStart;
      SetLength(aTemp, iSize + 1);
      SetLength(AResult, iSize + 1);
    
      for iLoop := 0 to iSize do
        aTemp[iLoop] := AStart + iLoop;
    
      for iLoop := 0 to iSize do begin
        // Get random index
    iRnd  := Random(iSize + 1);
    
        // Store number
    AResult[iLoop]  := aTemp[iRnd];
    
        // Removal procedure:
        //  - Move last item to the item to be removed
        //  - Resize the array to chop off the last item
    aTemp[iRnd]     := aTemp[iSize];
        SetLength(aTemp, iSize);
    
        // Use iSize instead of High() every time for
        // random number generation, eliminates a lot
        // of useless calls...
    Dec(iSize);
      end;
    end;
    
    procedure TfrmTest.FormCreate;
    var
      aNumbers:   TIntegerArray;
      iLoop:      Integer;
    
    begin
      GenUniqueRndNumbers(1, 20, aNumbers);
    
      txtNumbers.Lines.Clear();
      for iLoop := 0 to High(aNumbers) do
        txtNumbers.Lines.Add(IntToStr(aNumbers[iLoop]));
    end;
    

    Getest en al... en retesnel, maar goed, op een 1.8 Ghz is alles snel, alhoewel ik niet verwacht dat het een trage routine is....



    Inderdaad, hij's razendsnel... (toch blij dat ik die P133 niet heb weggegooid )
    Qui custodiet ipsos custodes

  6. #6
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127

    Talking

    Kijk... dat zijn berichten
    Het werkt inderdaad als de brandweer, in de tijd die ik nodig had om 800 getallen
    unique te radomizen, kan ik er nu 8000 doen

    Toppie Psycho, bedankt.

    Ps. Marcel, als je achterafgezien vindt dat dit toch in de vraagbaak hoort...
    Be My Guest en verplaats e'm

    Richard.
    RLD

  7. #7
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Het probleem met jouw methode is dat hoe minder mogelijkheden er zijn, hoe minder kans er is dan Random() een goed getal eruit kiest, waardoor die functie dus exponentieel zoveel tijd gaat gebruiken...

    Enfin, het is opgelost, fijn dat ik weer iemand heb kunnen helpen
    Qui custodiet ipsos custodes

  8. #8
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127
    Psycho,

    Ik was nog eens even jouw code aan het bestuderen ik snap alleen 1 stukje niet.
    Code:
    // Removal procedure:
        //  - Move last item to the item to be removed
        //  - Resize the array to chop off the last item
          aTempArray[iRnd] := aTempArray[iArraySize];
          SetLength(aTempArray, iArraySize);
    Zou je deze mischien kunnen toelichten, ik heb nu ongeveer een kwartier zitten
    staren maar ik zie het domweg niet.

    Richard
    RLD

  9. #9
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Het is hele simpele logica, maar je moet 't inderdaad even zien. Ok, stel je voor dat we deze array hebben:

    1,2,3,4,5,6


    Daar willen we 4 tussenuit halen. Als de volgorde belangrijk zou zijn dan zouden we van 4 t/m (Max-1) loopen (4 tot 5 dus) en dan Item[Loop] := Item[Loop + 1], waardoor alles (behalve het laatste item) eentje terugschuift, dan krijgen we dit:

    1,2,3,5,6,6


    Dan kort je de array in met SetLength en je houdt netjes 1,2,3,5,6 over...



    Bij deze methode is er alleen een probleem: hoe groter de array hoe trager. In het geval van random nummer genereren maakt de volgorde van de temp array helemaal niks uit, zolang er maar geen dubbele getallen in komen te staan. In dat geval kan je doen wat ik doe in mijn code:


    1,2,3,4,5,6

    4 eruit, kopieer laatste item naar item 4. resultaat:

    1,2,3,6,5,6

    Haal nu net als bij de eerste methode het laatste item weg met SetLength:

    1,2,3,6,5



    Voila, de 4 is ertussenuit met maar 2 stappen


    U snap?
    Qui custodiet ipsos custodes

  10. #10
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127
    Juistem

    Dus als ik het goed begrijp haal je met SetLength ook nog eens de dubbele items
    uit een Array ?

    Als dat zo is dan is dat de reden dat ik het niet echt kon volgen

    Bedankt voor de uitleg.

    Richard
    RLD

  11. #11
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    SetLength resized een dynamische array. De lengte die ik opgeef is gelijk aan High(Array). High geeft bij een normale 0-based array altijd Length-1. Als ik dus die waarde meegeef aan SetLength dan resized deze de array zo dat ie 1 item kleiner is, waardoor het laatste item verdwijnt. Met de uitleg hierboven zorg ik dat ik alle items die ik wil behouden ervoor zet zodat het laatste item weg kan....
    Qui custodiet ipsos custodes

  12. #12
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127
    Hij is duidelijk

    Alhoewel het wel 'moeilijk'/'lastig' te begrijpen is.

    Bedankt voor de rijkelijke uitleg.

    Richard
    RLD

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Replies: 14
    Last Post: 01-Jan-05, 22:06
  2. String bewerking: Code uit een pad halen
    By RealKillaz in forum Algemeen
    Replies: 6
    Last Post: 31-Mar-04, 12:38
  3. Floppy controle . . .
    By KeesC in forum Algemeen
    Replies: 2
    Last Post: 01-Nov-03, 23:06

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •