Avatar billede KurtG Seniormester
27. oktober 2021 - 11:54 Der er 3 kommentarer og
2 løsninger

Delphi5. Oprette, navngive, placere og angive værdi på Label i loop.

Jeg skal grafisk tegne nogle måleværdier i et TImage.
I et loop tegner jeg et lodret og vandret gitter, hvor antallet af linjer og afstand mellem dem fastlægges i programmet.
Samtidig med tegningen af gitteret vil jeg gerne sætte label ud for gitterlinjerne, hvor værdien for gitterlinjen angives.

Jeg har i øjeblikket følgende:
function MakeScale(x_pix, y_pix: Integer):Boolean;
//  y_pix er antal pixel pr mm regn.
Var i, Bund, tmp1, tmp2, tmp3, tmp4: Integer;
Begin
  Form1.Image1.Canvas.Pen.Width := 1;
  Form1.Image1.Canvas.Pen.Color := clBlue;
  Form1.Image1.Canvas.FillRect(Rect(2,2,Form1.Image1.Width-2,Bund-2));
  Bund := Form1.Image1.Height;
  //Tegn x-akser
  for i:=1 to Round(Form1.Image1.Width/x_pix) do
  Begin
    Form1.Image1.Canvas.MoveTo(i*x_pix,Bund);
    Form1.Image1.Canvas.LineTo(i*x_pix,0);
    //Her skal der anbringes labels på x-aksen
  End;
  //Tegn y-akser
  for i:=1 to Round(Form1.Image1.Height/y_pix) do
  Begin
    Form1.Image1.Canvas.MoveTo(0,Bund-(i*y_pix));
    Form1.Image1.Canvas.LineTo(0,Form1.Image1.Width-Bund-(i*y_pix));
    //Her skal der anbringes labels på y-aksen
  End;
End;

Jeg kan godt lave en label:
    Lab := TLabel.Create(Self);
    Lab.Parent := Form1;
    Lab.Caption := IntToStr(i);
    Lab.Left := Form1.Image1.Left-Form1.Label1.Width-3
    Lab.Top := Form1.Image1.top + Form1.Image1.Height-tmp1-6;
Men hvis jeg gør det i mit loop, er det jo den samme label, der flyttes rundt.
Hvordan opretter jeg en ny label for hvert gennemløb?
Avatar billede arne_v Ekspert
27. oktober 2021 - 13:55 #1
Altså TLabel.Create vil lave en ny label for hvert gennemløb af løkken.

Dit problem er at du på venstresiden skal have forskellige variable for hcert gennemløb.

Altså noget med at tilføje de labels dynamisk til formen.
Avatar billede KurtG Seniormester
27. oktober 2021 - 14:30 #2
Hej Arne.
Du har ret, jeg skal kun danne de forskellige label een gang, det kan jeg gøre i en løkke inden.
Men hvordan kan jeg (nok noget med [i]) tilgå de forskellige labelnavne, der jo skal ændres ved hvert gennemløb?
Jeg synes, at jeg på et tidspunkt har set det, men det kan også have været til C-programmering!
Avatar billede arne_v Ekspert
27. oktober 2021 - 15:12 #3
Til inspiration:


unit DynLblUnit;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  dl : array [0..9] of TLabel;

procedure TForm1.Button1Click(Sender: TObject);

var
  i : integer;

begin
  for i := 0 to 9 do begin
    dl[i] := TLabel.Create(Self);
    dl[i].Parent := Form1;
    dl[i].Caption := 'Label #' + IntToStr(i);
    dl[i].Left := (i mod 5) * 50;
    dl[i].Top := (i div 5) * 20;
  end;
end;

end.
Avatar billede KurtG Seniormester
27. oktober 2021 - 17:19 #4
Tak, Arne.
Jeg prøvede det i et selvstændigt program og det virker efter hensigten.
Men når jeg indsætter det i mit program:

  for i:=1 to Round(Form1.Image1.Width/x_pix) do
  Begin
    Form1.Image1.Canvas.MoveTo(i*x_pix,Bund);
    Form1.Image1.Canvas.LineTo(i*x_pix,0);
    //Her skal der anbringes labels på x-aksen
    dynLabel[i] := TLabel.Create(Self);
  End;

får jeg fejlmeldingen:
[Error] RainUnit1.pas(102): Undeclared identifier: 'Self'

Den kan jeg ikke greje!
Avatar billede arne_v Ekspert
27. oktober 2021 - 17:44 #5
Du kan formentligt bruge Form1 i.s.f. Self.
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

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