Announcement

Collapse
No announcement yet.

automatisches erzeugen von X-labeln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • automatisches erzeugen von X-labeln

    hi,

    ich habe folgenden quellt text in c++:

    AnsiString slNewLabelNamePrefix = "NewLabel";

    // Ggf. zuvor erzeugte Labels entfernen:
    for(int ilCmpNo = 0; ilCmpNo < ComponentCount; ilCmpNo++)
    {
    if(Components[ilCmpNo]->Name.Pos(slNewLabelNamePrefix))
    {
    delete Components[ilCmpNo];
    ilCmpNo--;
    }
    }

    // Neue Labels erzeugen:
    TLabel* pCmpTemp;
    int ilCmpCount=editCmpCount->Text.ToIntDef(0);

    for(int i=0;i<ilCmpCount;i++)
    {
    pCmpTemp=new TLabel(this);
    pCmpTemp->Parent=this;
    pCmpTemp->Caption=AnsiString("Neues Label #")+AnsiString(i+1);
    pCmpTemp->Name=slNewLabelNamePrefix+AnsiString(i);
    pCmpTemp->Top=i*20+45;
    pCmpTemp->Left=20;
    }

    er erzeugt so viele Label's wie im edit drin stehen, ich brauch diese möglichkeit in delphi, also hab ich versucht den quelltext um zuschreiben:

    procedure TForm1.Button1Click(Sender: TObject);
    var slNewLabelNamePrefix:String;
    ilCmpNo,ilCmpCount,i:Integer;
    pCmpTemp: TLabel;
    begin

    slNewLabelNamePrefix := 'NewLabel';
    // Ggf. zuvor erzeugte Labels entfernen:
    for ilCmpNo:= 0 to ComponentCount-1 do
    begin
    if(Pos(Components[ilCmpNo].Name,slNewLabelNamePrefix))<>0 then
    begin
    Components[ilCmpNo].free;
    end;
    end;

    // Neue Labels erzeugen:
    ilCmpCount:= StrToInt(Edit1.Text);

    for i:=1 to ilCmpCount-1 do
    begin
    pCmpTemp:= TLabel.Create(Self);
    pCmpTemp.Parent:=Self;
    pCmpTemp.Name:=slNewLabelNamePrefix+String(i);
    pCmpTemp.Caption:=String('Neues Label #')+String(i+1);

    pCmpTemp.Top:=i*20+45;
    pCmpTemp.Left:=20;
    end;
    end;

    er sollte eigentlich gehen, macht er aber net ich bekomme immer eine zugriffs verletzung. Kann mir jemand helfen?

    MfG Stephan

  • #2
    Probiere es mal so:<p>
    <pre>procedure TForm1.Button1Click(Sender: TObject);
    var slNewLabelNamePrefix:String;
    ilCmpNo,
    ilCmpCount,
    i:Integer;
    pCmpTemp: TLabel;
    begin
    slNewLabelNamePrefix := 'NewLabel';

    // Unbedingt rückwärts laufen
    for ilCmpNo:= ComponentCount - 1 downto 0 do begin
    if(Pos(Components[ilCmpNo].Name,slNewLabelNamePrefix))<>0 then begin
    Components[ilCmpNo].free;
    end;
    end;

    // Neue Labels erzeugen:
    ilCmpCount:= StrToInt(Edit1.Text);

    for i:=1 to ilCmpCount-1 do begin
    pCmpTemp:= TLabel.Create(Self);
    pCmpTemp.Parent:=Self;
    pCmpTemp.Name:=slNewLabelNamePrefix+String(i);
    pCmpTemp.Caption:=String('Neues Label #')+String(i+1);
    pCmpTemp.Top:=i*20+45;
    pCmpTemp.Left:=20;
    end;
    end; </pre><p>
    Ich habe die Schleife zum Löschen umgestellt, aber nicht getestet. Du kannst nicht in einer Schleife bis zu Count hochzählen, wenn Du dann Labels löscht.<p>
    Beispiel: Du läufst in einer Schleife bis 3: 0, 1, 2, 3<br>
    Dann löscht Du in der Schleife die 2: 0, 1, 3.<br>
    Somit ist dein drittes Element auf einmal die 3 und das vierte gibt es nicht mehr. Das ist dann die Zugriffsverletzung!<p>
    Schöne Grüße, Mario Noack<p>
    PS: Quellcode mit &lt;pre&gt; einfassen. Dann wirds auch leserlich
    Schöne Grüße, Mario

    Comment


    • #3
      hi Mario,

      danke erst mal für den tip mit der schleife und dem quelltext.
      Die schleife geht, muste nur die Parametr von Pos noch rum drehen.
      die Zugriffsverletung is warscheinlich von "pCmpTemp.Name:=slNewLabelNamePrefix+String(i) ;" habe den string vorher zusammen gebt und da geht's. aber nochmals danke.

      Mfg Stepha

      Comment

      Working...
      X