Ersetzen von Stringabschnitten

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Clemensch
Beiträge: 10
Registriert: Do 11. Feb 2021, 01:03

Ersetzen von Stringabschnitten

Beitrag von Clemensch »

Hallo Freunde,

ich habe ein Problem bei meinem Programm. Ich möchte ein Programm erstellen, welches durch mehrere SpinEdit-Komponente die Ausgabe in ein und derselben Label-Komponente anzeigt. Dabei soll es den String aus dem Label vor dem SpinEdit-Klick speichern und nach dem SpinEdit-Klick anzeigen zusammen mit den neuen Wert. Dabei hat sich das Problem aufgestellt, dass an Stelle von z.B. "H5" nach 5-maligen drücken vonSpinEdit1 "H5H4H3H2H" steht oder "H2HHe3He2He" bei 2-maligen drücken von SpinEdit1 und 3-maligen drücken von SpinEdit2. Gibt es einen Weg dieses Problem zu beheben?

Code: Alles auswählen

procedure TForm2.SpinEdit1Change(Sender: TObject);
var Merke: string;
begin
  if SpinEdit1.value> 1
   then Label1.caption:='H'+IntToStr(SpinEdit1.Value)+Merke
  else
 if SpinEdit1.value=1
  then  begin Label1.caption:='H'+IntToStr(SpinEdit1.Value)+Merke;
  Label1.caption:=StringReplace(Label1.caption,'H1','H',[rfReplaceAll, rfIgnoreCase]) ;
  end;
 if SpinEdit1.value<=0
  then
  begin
  Label1.caption:='H'+IntToStr(SpinEdit1.Value)+Merke;
 Label1.caption:=Stringreplace(Label1.caption,'H','', [rfReplaceAll, rfIgnoreCase]);
 end;
 Merke:=Label1.caption;
end;

procedure TForm2.SpinEdit2Change(Sender: TObject);
var Merke: string;
begin
     if SpinEdit2.value> 1
   then Label1.caption:='He'+IntToStr(SpinEdit2.Value)+Merke
  else
 if SpinEdit2.value=1
  then  begin Label1.caption:='He'+IntToStr(SpinEdit2.Value)+Merke;
  Label1.caption:=StringReplace(Label1.caption,'He1','He',[rfReplaceAll, rfIgnoreCase]) ;
  end;
 if SpinEdit2.value<=0
  then
  begin
  Label1.caption:='He'+IntToStr(SpinEdit2.Value)+Merke;
 Label1.caption:=Stringreplace(Label1.caption,'He','', [rfReplaceAll, rfIgnoreCase]);
 end;
 Merke:=Label1.caption;
end;

end.  

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Ersetzen von Stringabschnitten

Beitrag von Winni »

Hi!

Und wo ist das Problem?

Winni

Clemensch
Beiträge: 10
Registriert: Do 11. Feb 2021, 01:03

Re: Ersetzen von Stringabschnitten

Beitrag von Clemensch »

Das Problem ist, dass ich nach den anklicken des SpinEdit-Feldes an Stelle von z.B. "H5H4H3H2H" nur "H5" aka den höchsten Wert stehen haben möchte und gleichzeitig auch, dass andere SpinEdit-Felder mit eingebaut werden können. Zum Beispiel dass ich 2x SpinEdit1 und 3x SpinEdit2 anklicke und das dann im Label steht "H2He3" oder bei 1x anklicken von SpinEdit1 und 5x anklicken SpinEdit2 dann im Label steht "HHe5"

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Ersetzen von Stringabschnitten

Beitrag von wennerer »

Hallo Clemens,
ich bin mir nicht sicher was genau dein Ziel ist, aber teste mal das:
Chemie.png
Chemie.png (7.11 KiB) 1185 mal betrachtet

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Spin, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure NewValue(Sender: TObject);
    procedure Reset(Sender: TObject);
  private
    Labels    : array [0..2] of TLabel;
    SpinEdit  : array[0..1] of TSpinEdit;
    ValueH    : string;
    ValueHE   : string;
    Button    : TButton;
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }


procedure TForm1.FormCreate(Sender: TObject);
var lv : integer;
begin
 caption := 'Chemie-Rechner';
 setbounds(300,200,475,200);

 for Lv:=0 to 1 do
  begin
    Labels[lv]             := TLabel.Create(self);
    Labels[lv].Parent      := self;
    Labels[lv].AutoSize    := false;
    Labels[lv].Left        := 25+(lv*150);
    Labels[lv].Top         :=  30;
    Labels[lv].Width       := 100;
    Labels[lv].Height      :=  30;
  end;
    Labels[0].Caption := 'Wasserstoff';
    Labels[1].Caption := 'Helium';

 for Lv:=0 to 1 do
  begin
    SpinEdit[lv]             := TSpinEdit.Create(self);
    SpinEdit[lv].Parent      := self;
    SpinEdit[lv].Left        := 25+(lv*150);
    SpinEdit[lv].Top         :=  55;
    SpinEdit[lv].Width       := 100;
    SpinEdit[lv].Height      :=  30;
    SpinEdit[lv].OnChange    := @NewValue;
  end;

 Labels[2]             := TLabel.Create(self);
 Labels[2].Parent      := self;
 Labels[2].AutoSize    := false;
 Labels[2].Left        := 325;
 Labels[2].Top         :=  55;
 Labels[2].Width       := 100;
 Labels[2].Height      :=  30;
 Labels[2].Caption     := '';
 Labels[2].Color       := clWhite;
 Labels[2].Alignment   := tacenter;
 Labels[2].Font.Height := 18;

 Button                := TButton.Create(self);
 Button.Parent         := self;
 Button.SetBounds(25,100,400,25);
 Button.Caption        := 'Reset';
 Button.OnClick        := @Reset;

 ValueH  := 'H';
 ValueHE := 'HE';
end;

procedure TForm1.NewValue(Sender: TObject);
begin
 if Sender = SpinEdit[0] then   //H
  begin
   ValueH := 'H' + inttostr(SpinEdit[0].Value);
   if SpinEdit[0].Value = 0 then ValueH  := 'H';
  end;

 if Sender = SpinEdit[1] then   //HE
  begin
   ValueHE := 'HE'+ inttostr(SpinEdit[1].Value);
   if SpinEdit[1].Value = 0 then ValueHE := 'HE';
  end;

 Labels[2].Caption := ValueH + ValueHE;
end;

procedure TForm1.Reset(Sender: TObject);
begin
 SpinEdit[0].Value := 0;
 SpinEdit[1].Value := 0;
 Labels[2].Caption := ''
end;

end.

Viele Grüße
Bernd
Dateianhänge
project1.zip
(125.93 KiB) 58-mal heruntergeladen

Antworten