Page 1 of 3 1 2 3 LastLast
Results 1 to 15 of 31

Thread: Property componenten wijzigen (Run-time)

  1. #1
    Member Gurbesoft's Avatar
    Join Date
    Feb 2007
    Location
    Augustinusga
    Posts
    33

    Property componenten wijzigen (Run-time)

    In mijn planmodule maak ik gebruik van gemodificeerde TLabel welke de duur van een bewerking weergeeft op een grid. Bij het scrollen (links<>rechts) worden van alle geplaatste labels de left property aangepast. Wanneer er niet te veel "planlabels" op de from staat, dan gaat dit probleemloos, echter wanneer ik heel veel "planlabels" op mijn form heb aangemaakt vertaagt dit enorm. Heel erg logisch want het procces is :

    For I := 0 to .... begin ... end;

    Nu kan je in de ide bijv. alle editboxen selecteren en in de objectinspector in 1 keer van alle editboxen de left of de text veranderen.

    Dit is precies wat ik wil met mijn "planlabels", is dit mogelijk?

  2. #2
    Je zou kunnen proberen of een LockWindowUpdate je helpt. Daarmee stel je het updaten van het form uit tot je alle aanpassingen hebt gedaan. Dus:

    Delphi Code:
    1. LockWindowUpdate(Handle);
    2. try
    3.   // doe je ding
    4. finally
    5.   LockWindowUpdate(0)
    6. end;
    Marcel

  3. #3
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Quote Originally Posted by Gurbesoft View Post
    Nu kan je in de ide bijv. alle editboxen selecteren en in de objectinspector in 1 keer van alle editboxen de left of de text veranderen.
    Dat komt (intern in de IDE) ook neer op een for-loop.

    Marcel's idee kan goed helpen.

    Maar ik begrijp dat dit een eigen afgeleide van TLabel is? Zie dan bijvoorbeeld deze post met een aantal tips om het (her)tekenen te versnellen.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  4. #4
    Member Gurbesoft's Avatar
    Join Date
    Feb 2007
    Location
    Augustinusga
    Posts
    33
    Meteen even getest en dit geeft niet het gewenste resultaat. Het beeld is, tijdens het scrollen, bij een paar planlabels al schokkerig. Zonder die regels, gaat het veel vloeiender.

    Als je bijv. een form vult met 2 á 300 editboxen en deze selecteer je allemaal (in de IDE), op het moment dat je dan de text wijzigt, worden gelijktijdig alle editboxen gewijzigd en dat is nou precies wat ik wil in run-time......

    Mijn planlabel is inderdaad een afgeleide van TLabel. Ik heb hier velden aan toegevoegd voor order en bon nummer e.d.
    Ik zal de tips van NGLN eens goed doorlezen en kijken of ik daar mee uit de voeten kan.
    Last edited by Gurbesoft; 17-Feb-10 at 13:16.

  5. #5
    Hoeveel is heel veel? Er is ook een verschil tuusen een TLabel en een TEdit (GraphicControl en WinControl)
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  6. #6
    Member Gurbesoft's Avatar
    Join Date
    Feb 2007
    Location
    Augustinusga
    Posts
    33
    Ik zit nu op 1290 TLabels.

    Misschien dat ik beter een ander type control kan nemen i.p.v. de TLabel en daar dan een nieuwe afgeleide van maken.....

    Welke componenten kan ik het beste gebruiken om als een planbalk te functioneren, die je kunt verschuiven en langer of korter maken?

  7. #7
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    TGraphicControl is het lichtste TControl waarop je kunt tekenen.
    Maar waarom niet gewoon een StringGrid? Zie voorbeeld.

    Quote Originally Posted by Gurbesoft View Post
    Als je bijv. een form vult met 2 á 300 editboxen en deze selecteer je allemaal (in de IDE), op het moment dat je dan de text wijzigt, worden gelijktijdig alle editboxen gewijzigd en dat is nou precies wat ik wil in run-time...
    Nogmaals, dat werkt ook met een for-loop.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  8. #8
    Member Gurbesoft's Avatar
    Join Date
    Feb 2007
    Location
    Augustinusga
    Posts
    33
    In mijn planning worden niet de personen getoond maar de order met hun bonnen en bewerkingen in de tijd. De gebruiker kan de schaal aanpassen (week, maand, jaar e.d.) van wat hij wil zien. Ik teken op een paintbox een grid, waarbij ik de dagen van de geselecteerde schaal laat zien met daarin de weekenden vrije dagen vakanties e.d. Ik heb het geprobeerd met een stringgrid, alleen kreeg ik niet het gewenste resultaat....

    Wanneer ik geen planbalkjes toon, dan werkt het scrollen razendsnel... de beperking is dus echt de manier zoals ik de balkjes laat zien. De keuze is gevallen op een label, omdat die al een mooi rechthoekig balkje is en er een caption op zit..... gemakkelijkheid voor alles
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	planning.jpg 
Views:	146 
Size:	91.5 KB 
ID:	4842  

  9. #9
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Als je toch aan het tekenen bent, waarom maak je dan geen gebruik van de TCanvas.textout()?
    Delphi is great. Lazarus is more powerfull

  10. #10
    Member Gurbesoft's Avatar
    Join Date
    Feb 2007
    Location
    Augustinusga
    Posts
    33
    Het probleem is dat ik het niet voor elkaar kan krijgen om een TRect te rekken en te verschuiven. Tevens moet ik er inteligentie aan meegeven omdat er diverse dingen zichtbaar kunnen worden gemaakt wanneer men op een label klikt/dubbel klikt.

    Uiteraard voor het weergeven van weken, dagen en maanden gebruik ik TextOut om te tekenen op de canvas.

  11. #11
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Ik ben het met John eens dat je veel beter zelf kunt tekenen. Zie eventueel ook Rooster maken waarin ook eerst met labels werd gewerkt en daarna is omgezet naar zelf tekenen.

    Interactie is dan inderdaad iets lastiger, maar niet onmogelijk. Trouwens, hoe "stretch" jij nu die label dan?

    p.s. Dit is spekkie naar mijn bekkie; ik kan vanavond wel even in je code duiken.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  12. #12
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Ik zou proberen een Virtual String Tree te gebruiken. Die kan je ook als een grid gebruiken (zie de advanced demo). Deze update relatief efficient, en neemt die zorg uit handen.

  13. #13
    Member Gurbesoft's Avatar
    Join Date
    Feb 2007
    Location
    Augustinusga
    Posts
    33
    In de resize van mijn form gebruik ik dit:

    Code:
      If FObjectList.Count > 0 then
      begin
      For I := 0 to FObjectList.Count-1 do
        begin
          A := Ceil(DateTimeToJulianDate(StrToDateTime(Grid.Cells[2,I+1])-Z));
          B := GridTag;
          C := GridColWidth+1;
          D := Ceil(DateTimeToJulianDate(StrToDateTime(Grid.Cells[4,I+1])-Z));
          P := StrToInt(Grid.Cells[17,I+1]);
          VC := StrToFloat(Grid.Cells[15,I+1]);
          NC := StrToFloat(Grid.Cells[16,I+1]);
          X := -((B-1)*C)+((A-StartGrid)*C)+2; //2452105 Dit is de beginpositie van de balk
          Y := C*(D-A+1)-1; // Dit is de lengte van de balk
          TGRBPlanLabel(FindComponent('PlanLabel' + IntToStr(I))).Height := 13;
          TGRBPlanLabel(FindComponent('PlanLabel' + IntToStr(I))).ColWidth := GridColWidth;
          TGRBPlanLabel(FindComponent('PlanLabel' + IntToStr(I))).Position := A;
          TGRBPlanLabel(FindComponent('PlanLabel' + IntToStr(I))).Left := X;
          If P > 100 then
          TGRBPlanLabel(FindComponent('PlanLabel' + IntToStr(I))).Width := Y + (C * Floor((NC-VC) / 7.6))
          else
          TGRBPlanLabel(FindComponent('PlanLabel' + IntToStr(I))).Width := Y;
        end;
      end;
      Paintbox2.Refresh;
    In de label zelf heb ik het draggen en strechen opgenomen:

    Code:
    procedure TGRBPlanLabel.MouseUp(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
    var
      Z: Integer;
      Tijd: String;
    begin
      FDragKind := dkNone;
      If (Left <> OldLeft) or (Width <> OldWidth) then
      begin
        Tijd := FormatDateTime('hh', Now);
        If StrToInt(Tijd) >= 12 then
        Z := StrToInt('0')
        else
        Z := StrToInt('1');
    
        with TCrack(Self) do
        begin
          drawHandle(Self,true);
    
          If (Left <> OldLeft) or (Width <> OldWidth) then
          begin
            If Left > OldLeft then
            begin
              FPosition := FPosition + Ceil((Left-OldLeft)/(FGridColWidth+1));
              FPlanWidth := FPosition + Ceil(Width/(FGridColWidth+1))-1;
            end
            else
            begin
              FPosition := FPosition - Ceil((OldLeft-Left)/(FGridColWidth+1));
              FPlanWidth := FPosition + Ceil(Width/(FGridColWidth+1))-1;
            end;
    
            If Width > OldWidth then
            begin
              FPlanWidth := FPosition + Ceil(Width/(FGridColWidth+1))-1;
            end
            else
            begin
              FPlanWidth := FPosition + Ceil(Width/(FGridColWidth+1))-1;
            end;
          end;
        end;
        FStartDatum := FPosition+Z;
        FEindDatum := FPlanWidth+Z;
        FDuur := EindDatum - StartDatum;
        FChanged := True;
      end;
      inherited;
    end;
    Ik houd er rekening mee of het event voor of na de middag gebeurt i.v.m. de juliandate

  14. #14
    Wat kan schelen:
    - Voor updaten AlignControls (oid) van de parent uitzetten, daarna weer aanzetten
    (dit dus voor en na de loop)
    - Updaten positie van een label, gebruik setbounds (zet alles in 1 keer)
    (sommige componenten herteken zich zelf bij iedere wijziging van .Left, .Width etc.) met setbounds voorkom je dit.
    - LockWindowUpdate (zie marcels post)

    Heb zelf bij een project de controls weggehaald en alles zelf getekend, ging velen malen sneller.

  15. #15
    Member Gurbesoft's Avatar
    Join Date
    Feb 2007
    Location
    Augustinusga
    Posts
    33
    Onderstaande code gebruik ik voor het scrollen:

    Code:
    procedure TPlan1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    var
      OldPos: Integer;
    begin
      OldPos := GridCol;
      GridCol := ScrollPos;
      If OldPos > ScrollPos then
      begin
        If FObjectList.Count > 0 then
        begin
          For Z := 0 to FObjectList.Count-1 do
          begin
            TGRBPlanLabel(FindComponent('PlanLabel' + IntToStr(Z))).Left := TGRBPlanLabel(FindComponent('PlanLabel' + IntToStr(Z))).Left + ((OldPos - ScrollPos)*(GridColWidth+1));
          end;
        end;
      end
      else
      begin
        If FObjectList.Count > 0 then
          begin
          For Z := 0 to FObjectList.Count-1 do
          begin
           TGRBPlanLabel(FindComponent('PlanLabel' + IntToStr(Z))).Left := TGRBPlanLabel(FindComponent('PlanLabel' + IntToStr(Z))).Left - ((ScrollPos - OldPos)*(GridColWidth+1));
          end;
        end;
      end;
      PaintBox2.Refresh; // Datum, maand, jaar balk
      PaintBox3.Refresh; // Scherm waar de planbalken op staan
    end;
    In combinatie met de andere post, waar/hoe moet ik functie gebruiken?
    Ik heb tevens een scherm waar de bezetting van de diverse bewerkingen in worden weergegeven, daar teken ik wel alles en die is inderdaad veel sneller. Het nadeel van mijn gebrek aan kennis is dat ik het niet voor elkaar krijg om zo'n getekend vlakje te kunnen verschuiven naar links en rechts of langer en korter maken....

Page 1 of 3 1 2 3 LastLast

Thread Information

Users Browsing this Thread

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

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
  •