Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

Probleem bij gebruik van Metafiles, Canvas in Delphi 7 Prof

Hans.Vosman
1 antwoord
  • Ik wil dus tekst gecombineerd met plaatjes in een Windows Form afbeelden. Vervolgens wil ik om de 1 à 5 seconden de informatie verversen. In principe lukt het mij uiteindelijk de tekst en plaatjes zichtbaar te maken en te verversen. Methode 2 werkt voor mij het beste alleen wordt die door, vermoedelijk een te hoog geheugen gebruik (tot 1,5GB), uiteindelijk onwerkbaar traag. Mijn computer blijft overigens wel aanspreekbaar … Ik heb 2 methoden geprobeerd:
    1. Rechtstreeks via Canvas
    2. Met een Metafile via een MetafileCanvas

    Bij methode 1 komen de tekstkleuren niet overeen met de verwachte kleuren. Ook weet ik niet hoe de inhoud van WIndows venster opnieuw zichtbaar gemaakt zou kunnen worden als een deel van het venster even niet zichtbaar is geweest door overlap met een ander venster. Vermoedelijk moet ik alle informatie opnieuw tekenen.
    Bij methode 2 verslikt mijn computer zich. Deze gaat dus vermoedelijk geheugen vreten.

    Nu dacht ik, ik maak een eenvoudig voorbeeld aan de hand van een Ellips voorbeeld uit een boek omdat ik misschien in mijn toch wel wat complexe programma iets raars heb gedaan. Dit voorbeeld loopt op vergelijkbare wijze vast. Maar er is meer. In methode 1 kan ik zo'n 10000 ellipsen in 1 seconden tekenen, in methode 2 verslikt het programma zich al bij 100.
    De bijgevoegde code is van methode 2 omdat ik daar vermoedelijk het meeste mee zou kunnen. Methode 1 is zonder de Metafiles en alleen met Canvas. Structuur is verder identiek. Enig idee wat ik over het hoofd zie? Oh ja, het principe van de Metafile heb ik gewoon uit de help van Delphi geplukt (daar stond iets in over rode en blauwe ellipsen).
    [code:1:e0cfb291cb]
    unit Main2;

    { Program copyright (c) 1995 by Charles Calvert }
    { Project Name: ELLIPSES }

    { Program to show how to use the Canvas object to
    draw ellipses to the screen. Also demonstrates
    a few facts about the Delphi coordinate system,
    and about accessing the colors available on your
    system.

    Some cosmetic issues:
    Panel added at top of screen, and controls placed
    on panel. A second panel used instead of a label. }



    interface

    uses
    Windows, WinTypes, WinProcs, SysUtils,
    Classes, Graphics, StdCtrls,
    Controls, Printers, Forms, ExtCtrls;

    type
    TForm1 = class(TForm)
    Panel1: TPanel;
    Start: TButton;
    Panel2: TPanel;
    Edit1: TEdit;
    Timer1: TTimer;
    Label1: TLabel;
    procedure BStartClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure WriteEllips;
    Procedure ShowTime;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormPaint(Sender: TObject);
    private
    EllipsCtr: integer;
    DispMetafile: TMetafile;
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.WriteEllips;
    var
    NewCanvas: TMetafileCanvas;
    Borders: Integer;
    i, j, x, y: Integer;
    R: TRect;
    begin
    NewCanvas := TMetafileCanvas.Create(DispMetafile, 0);
    if(Newcanvas <> nil)then
    with NewCanvas do
    try
    Draw(0, 0, DispMetafile);
    j := 0;
    R := GetClientRect;
    x := R.Right;
    Borders := Panel1.Height;
    y := R.Bottom - Borders;
    i := StrToInt(Edit1.Text);
    while j < i do begin
    Ellipse(Random(x), Random(y) + Borders, Random(x), Random(y) + Borders);
    Brush.Color := RGB(Random(255), Random(255), Random(255));
    inc(j);
    end;
    finally
    free;
    end;
    Canvas.Draw(0, 0, DispMetafile);
    end;

    procedure TForm1.ShowTime;
    var
    NewCanvas: TMetafileCanvas;
    begin
    NewCanvas := TMetafileCanvas.Create(DispMetafile, 0);
    if(Newcanvas <> nil)then
    with NewCanvas do
    try
    Draw(0, 0, DispMetafile);
    Brush.Color := clGreen;
    Pen.Color := clRed;
    Windows.SetTextColor(Handle, clYellow);
    Label1.Caption := 'At this moment it is ' + TimeToStr(Now);
    TextOut(10, 150, 'At this moment it is ' + TimeToStr(Now));
    finally
    free;
    end;
    Canvas.Draw(0, 0, DispMetafile);
    end;

    procedure TForm1.BStartClick(Sender: TObject);
    begin
    WriteEllips;
    Edit1.SetFocus;
    { Edit1.Text := ''; }
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Edit1.Text := '100';
    Timer1.Interval := 1000;
    Timer1.Enabled := TRUE;
    EllipsCtr := 5;
    Canvas.TextFlags := ETO_NUMERICSLATIN;
    DispMetafile := TMetafile.Create;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    Timer1.Enabled := FALSE;

    Dec(EllipsCtr);
    if(EllipsCtr <= 0)then
    begin
    EllipsCtr := 5;
    WriteEllips;
    end;

    ShowTime;

    Timer1.Enabled := TRUE;
    end;

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    DispMetafile.Free;
    end;

    procedure TForm1.FormPaint(Sender: TObject);
    begin
    Canvas.Draw(0, 0, DispMetafile);
    end;
    [/code:1:e0cfb291cb]

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.