Dwie grupy RadioButton jedna nie działa

0

Witam.

Można prosić o pomoc, dlaczego dla pierwszych trzech RadioButton działa ok
a dla pozostałych czterech nie. Stale pozostałe pamiętają ustawienia z chwili zamknięcia okna.

w "s" wartości : dla s[1] 1..3 dla s[2] 4..7

Chec.jpg


procedure TForm38021.FormShow(Sender: TObject);
begin
     tak := False;
     RadioButton1.Checked := false;
     RadioButton2.Checked := false;
     RadioButton3.Checked := false;
     TRadioButton(FindComponent('RadioButton'+s[1])).Checked := true;
     RadioButton4.Checked := false;
     RadioButton5.Checked := false;
     RadioButton6.Checked := false;
     RadioButton7.Checked := false;
     TRadioButton(FindComponent('RadioButton'+s[2])).Checked := true;
end;

 

Pozdrawiam
Janusz

1

Proponuję pomyśleć nad łatwiejszym interfejsem ;-)
Przechwytywanie.PNG

0

Dodaj do tego kodu: ShowMessage(s);

0

Azarien to nie program tylko proste narzędzie dla mnie.

0

_13th_Dragon Bład dalej występuje

0

@dasej - po pierwsze, mało kodu podałeś, więc nie wiemy co się dzieje ze zmienną s i nie wiadomo, czy faktycznie zawiera ona to, czego się spodziewasz; Po drugie nie wykonuj tego kodu w zdarzeniu OnShow, tylko w OnCreate formularza; Po trzecie:

tak := False;

rence opadajom... Artykuły dotyczące sensownego formatowania kodu czekają na Ciebie z otwartymi rękoma.

0

Jakiego typu jest zmienna s? To tablica czy string? Nie trzeba ustawiać Checked na False gdy ustawisz jednego z nich właściwość na True pozostałe same się ustawią.

0

furious. Jak mam to wpisać do create skoro może być wywoływane nawet 20 razy
np. wywołanie dla kolumny 1 s := 27
kolumny 3 s := 36
RadioButton1..3 ustawią się poprawnie, a 4..7 w tym przykładnie wywołanie dla kolumny
3 ustawi się na "Datę" a nie "Walutę" taki efekt jest na ekranie. D2007
tak := false; - może być zmienna := false;
jest potrzebna do czegoś innego i NIE MA w tym przypadku znaczenia.

kAzek. s : string;

2

@dasej: nie wiem czy zdajesz sobie do końca sprawę z tego co robisz. Poczytaj lepiej kurs z pordstawami, to będziesz wiedział więcej. Jeżeli zmienna S jest typu string. To wtedy S[1], to będzie pierwszy znak tej zmiennej. Analogicznie S[2], to będzie jej drugi znak.

Także jeżeli komponent na formatce ma własność Name ustawioną na RadioButton1 to zmienna S musi zawierać przynajmniej tekst zaczynający się od 1. Także najważniejsze już Tobie podpowiedziano wcześniej. Sposób lamerski, bo powinno się debugować kod. Ale co właściwie pokazuje się po zastosowaniu ShowMessage(S);? Bo zawartość zmiennej S jest tutaj kluczowym zagadnieniem.

A i tak jak pisali poprzednicy. Jeżeli kontrolki typu TRadioButton są umieszczone na TGroupBox (jest on ich Parentem) albo są to kontrolki dodane w TRadioGroupBox, to nie ma potrzeby ustawiania ich w ten sposób. Ponieważ ustawienie własności Checked jednego z nich na True, powoduje że pozostałe "automatycznie" odznaczą się.

0

kod po modyfikacji


procedure TForm38021.FormShow(Sender: TObject);
begin
     tak := False;
     Caption := 's = '+s;
     RadioButton1.Checked := false;
     RadioButton2.Checked := false;
     RadioButton3.Checked := false;
     TRadioButton(FindComponent('RadioButton'+s[1])).Checked := true;
     RadioButton4.Checked := false;
     RadioButton5.Checked := false;
     RadioButton6.Checked := false;
     RadioButton7.Checked := false;
     TRadioButton(FindComponent('RadioButton'+s[2])).Checked := true;
end;
 

a oto efekt działania, wartość "S" na belce.

s=27.jpg
s=36.jpg
s=14.jpg

Takie proste a nie działa.

0

No to powinno a nawet musi działać. Mi się wydaje że przypadkiem gdzieś dalej w kodzie ustawiasz Chceked dla RadioButton7.

0

Poniżej cały kod.

Dołożyłem jeden klawisz.
przed użyciem tego klawisza formatka popełnia błąd,
po jednokrotnym użyciu klawisza, formatka do
zamknięcia programu działa poprawnie.

unit Unit38021;

interface

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

type
  TForm38021 = class(TForm)
    SpeedButton8: TSpeedButton;
    SpeedButton9: TSpeedButton;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    RadioButton5: TRadioButton;
    RadioButton6: TRadioButton;
    RadioButton7: TRadioButton;
    Panel1: TPanel;
    Panel2: TPanel;
    Button1: TButton;
    procedure SpeedButton9Click(Sender: TObject);
    procedure SpeedButton8Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
  public
    tak : boolean;
    s : string;
  end;

var
  Form38021: TForm38021;

implementation

{$R *.dfm}

procedure TForm38021.Button1Click(Sender: TObject);
begin
     tak := False;
     Caption := 's = '+s;
     TRadioButton(FindComponent('RadioButton'+s[1])).Checked := true;
     TRadioButton(FindComponent('RadioButton'+s[2])).Checked := true;
end;

procedure TForm38021.FormShow(Sender: TObject);
begin
     tak := False;
     Caption := 's = '+s;
     TRadioButton(FindComponent('RadioButton'+s[1])).Checked := true;
     TRadioButton(FindComponent('RadioButton'+s[2])).Checked := true;
end;

procedure TForm38021.SpeedButton8Click(Sender: TObject);
begin
     tak := True;
     close;
end;

procedure TForm38021.SpeedButton9Click(Sender: TObject);
begin
    tak := False;
    close;
end;

end.
0

Nie wiem z czym masz problem... Przecież sposób, który wykorzystujesz działa poprawnie; Stworzyłem sobie prostą aplikację aby sprawdzić, no i poniższy kod działa poprawnie:

procedure TForm1.btnSetClick(Sender: TObject);
var
  strValue: AnsiString;
begin
  strValue := edtValue.Text;

  if Length(strValue) < 2 then
    Application.MessageBox('Invalid value in text field!  ', 'Set Checks', MB_ICONSTOP)
  else
  begin
    TRadioButton(FindComponent('RadioButton' + strValue[1])).Checked := True;
    TRadioButton(FindComponent('RadioButton' + strValue[2])).Checked := True;
  end;

  ActiveControl := edtValue;
end;

Oczywiście, jeśli tylko w polu edycyjnym poda się prawidłowy łańcuch; Nie powinno być z tym żadnego problemu, jeżeli komponenty faktycznie należą do dwóch paneli (czyli są dwie grupy przycisków, każda z nich ma swojego rodzica), oraz jeśli łańcuch ma poprawną zawartość; Poniżej zrzut z działania programu:

screen.png

W załączniku projekt do skompilowania i sprawdzenia.

0

Podany przez Ciebie przykład u mnie też działa
Dodaj jedną formę wcześnie i wtedy spróbuj.
np.

Form38021.s := sGrid2.Cells[sGrid2.Col,1];
Form38021.ShowModal;
0

Zrobiłem jeszcze inaczej

procedure TForm38021.FormShow(Sender: TObject);
begin
     tak := False;
     Caption := 's = '+s;

     if s[1]='1' then RadioButton1.Checked := true;
     if s[1]='2' then RadioButton2.Checked := true;
     if s[1]='3' then RadioButton3.Checked := true;

     if s[2]='4' then RadioButton4.Checked := true;
     if s[2]='5' then RadioButton5.Checked := true;
     if s[2]='6' then RadioButton6.Checked := true;
     if s[2]='7' then RadioButton7.Checked := true;

end;

W pracy krokowej wszystko jest OK,
parametry zmieniają się poprawnie a na ekranie są wyświetlane błędnie.

0

object Form38021: TForm38021
  Left = 0
  Top = 0
  BorderIcons = [biSystemMenu]
  BorderStyle = bsSingle
  Caption = 'Form38021'
  ClientHeight = 134
  ClientWidth = 299
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object SpeedButton8: TSpeedButton
    Left = 98
    Top = 103
    Width = 40
    Height = 22
    Caption = 'Tak'
    OnClick = SpeedButton8Click
  end
  object SpeedButton9: TSpeedButton
    Left = 158
    Top = 103
    Width = 40
    Height = 22
    Caption = 'Nie'
    OnClick = SpeedButton9Click
  end
  object Panel1: TPanel
    Left = 8
    Top = 8
    Width = 137
    Height = 89
    BevelOuter = bvSpace
    TabOrder = 0
    object RadioButton1: TRadioButton
      Left = 16
      Top = 9
      Width = 113
      Height = 17
      Caption = 'Do lewej'
      Checked = True
      TabOrder = 0
      TabStop = True
    end
    object RadioButton2: TRadioButton
      Left = 16
      Top = 32
      Width = 113
      Height = 17
      Caption = 'Do '#347'rodka'
      TabOrder = 1
    end
    object RadioButton3: TRadioButton
      Left = 16
      Top = 55
      Width = 113
      Height = 17
      Caption = 'Do prawej'
      TabOrder = 2
    end
  end
  object Panel2: TPanel
    Left = 151
    Top = 8
    Width = 137
    Height = 89
    BevelOuter = bvSpace
    TabOrder = 1
    object RadioButton4: TRadioButton
      Left = 15
      Top = 9
      Width = 113
      Height = 17
      Caption = 'Tekst'
      Checked = True
      TabOrder = 0
      TabStop = True
    end
    object RadioButton5: TRadioButton
      Left = 15
      Top = 27
      Width = 113
      Height = 17
      Caption = 'Liczba'
      TabOrder = 1
    end
    object RadioButton6: TRadioButton
      Left = 15
      Top = 45
      Width = 113
      Height = 17
      Caption = 'Waluta z'#322'oty'
      TabOrder = 2
    end
    object RadioButton7: TRadioButton
      Left = 15
      Top = 64
      Width = 113
      Height = 17
      Caption = 'Data sql'
      TabOrder = 3
    end
  end
  object Button1: TButton
    Left = 8
    Top = 103
    Width = 25
    Height = 25
    Caption = 'Button1'
    TabOrder = 2
    OnClick = Button1Click
  end
end
 
0

To na jakim formularzu znajdują się Twoje komponenty nie ma znaczenia dla tego, co chcesz zrobić; Chyba, że Twój kod znajduje się w innej klasie niż modalna, to oczywiście nie zadziała poprawnie;

Skup się i zrób to jak należy, bo na pewno robisz coś źle, stąd Twój kod nie działa prawidłowo.

0

Opublikowałem już cały kod nic więcej niem.
Błąd jest pod Delphi 2007 i Delphi 7 dokładnie taki sam.
Można to zrobić prościej

     if s[1]='1' then RadioButton1.Checked := true;
     if s[1]='2' then RadioButton2.Checked := true;
     if s[1]='3' then RadioButton3.Checked := true;
 
     if s[2]='4' then RadioButton4.Checked := true;
     if s[2]='5' then RadioButton5.Checked := true;
     if s[2]='6' then RadioButton6.Checked := true;
     if s[2]='7' then RadioButton7.Checked := true;
 

Ten kod też nie działa poprawnie.

0

Jedyne co mogę zaproponować to to, abyś dołączył cały projekt do załączników posta - wtedy uruchomię go u siebie pod Delphi7 i sprawdzę dlaczego Twój kod nie działa prawidłowo.

0

w zip bardzo skrócona wersja
błąd występuje nadal
KonertCsvToExcel.zip

1
procedure TForm38021.FormShow(Sender: TObject);
var Btn:TRadioButton;
begin
     tak := False;
     Caption := 's = '+s;
     Btn:=TRadioButton(FindComponent('RadioButton'+s[1]);
     if Btn<>nil then Btn.Checked:=true else ShowMesage('Nie ma tu takiego przycisku "'+s[1]+'"');
     Btn:=TRadioButton(FindComponent('RadioButton'+s[2]);
     if Btn<>nil then Btn.Checked:=true else ShowMesage('Nie ma tu takiego przycisku "'+s[2]+'"');
end;

Tak a propos jak użyjesz TRadioGroup to na 100% będzie po kłopocie.

0

Witam.
_13th_Dragon Oczywiścnie można to roziwązać inaczej. Przedstawiony przez Ciebie algorytm również popełnia ten sam bład.

Przypuszcząm że jest to porządnie zakorzeniony błąd kompilatora (na 90% ) lub windy.
Teraz to już tylko czekam na potwierdznie innych że mam rację w przypuszczeniach.

Pozdrawiam
Janusz

0

Tak a propos jak użyjesz TRadioGroup to na 100% będzie po kłopocie.

procedure TForm38021.FormShow(Sender: TObject);
begin
     tak := False;
     Caption := 's = '+s;
     RadioGroup1.ItemIndex := StrToInt( s[1]);
     RadioGroup2.ItemIndex := StrToInt( s[2]);

end;

 

To rozwiązanie również popełnia błąd.
Wychodzi na to że błąd jest zakorzeniony w samym RadioButton z którego korzysta RadioGroup.
Parametry w obu przypadkach przy pracy krokowej są poprawne, ale są odtwarzane te które
forma zapamiętała przy zamknięciu.

0
     RadioGroup1.ItemIndex := StrToInt( s[1])-1;
     RadioGroup2.ItemIndex := StrToInt( s[2])-4;
0

Tak.

Nadałem wartości 0..2, 0..3. Wziełem to pod uwagę.

2
unit Unit38021;

interface

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

type
  TForm38021 = class(TForm)
    SpeedButton8: TSpeedButton;
    SpeedButton9: TSpeedButton;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    RadioButton5: TRadioButton;
    RadioButton6: TRadioButton;
    RadioButton7: TRadioButton;
    Panel1: TPanel;
    Panel2: TPanel;
    procedure SpeedButton8Click(Sender: TObject);
    procedure SpeedButton9Click(Sender: TObject);
  private
  public
    class function Execute(const code:String):String;
  end;

var
  Form38021: TForm38021;

implementation

{$R *.dfm}

class function TForm38021.Execute(const code:String):String;
var I:Integer;
begin
  with Create(Application) do
  begin
    try
      for I:=1 to Length(code) do TRadioButton(FindComponent('RadioButton'+code[I])).Checked:=true;
      if ShowModal=mrYes then
      begin
        SetLength(Result,0);
        for I:=1 to 7 do if TRadioButton(FindComponent('RadioButton'+IntToStr(I))).Checked then Result:=Result+IntToStr(I);
      end
      else Result:=code;
    finally
      Free;
    end;
  end;
end;

procedure TForm38021.SpeedButton8Click(Sender: TObject);
begin
  ModalResult:=mrYes;
end;

procedure TForm38021.SpeedButton9Click(Sender: TObject);
begin
  ModalResult:=mrNo;
end;

end.
object Form38021: TForm38021
  Left = 997
  Top = 370
  BorderIcons = [biSystemMenu]
  BorderStyle = bsSingle
  Caption = 'Form38021'
  ClientHeight = 134
  ClientWidth = 299
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  PixelsPerInch = 96
  TextHeight = 13
  object SpeedButton8: TSpeedButton
    Left = 98
    Top = 103
    Width = 40
    Height = 22
    Caption = 'Tak'
    OnClick = SpeedButton8Click
  end
  object SpeedButton9: TSpeedButton
    Left = 158
    Top = 103
    Width = 40
    Height = 22
    Caption = 'Nie'
    OnClick = SpeedButton9Click
  end
  object Panel1: TPanel
    Left = 8
    Top = 8
    Width = 137
    Height = 89
    BevelOuter = bvSpace
    TabOrder = 0
    object RadioButton1: TRadioButton
      Left = 16
      Top = 9
      Width = 113
      Height = 17
      Caption = 'Do lewej'
      Checked = True
      TabOrder = 0
      TabStop = True
    end
    object RadioButton2: TRadioButton
      Left = 16
      Top = 32
      Width = 113
      Height = 17
      Caption = 'Do srodka'
      TabOrder = 1
    end
    object RadioButton3: TRadioButton
      Left = 16
      Top = 55
      Width = 113
      Height = 17
      Caption = 'Do prawej'
      TabOrder = 2
    end
  end
  object Panel2: TPanel
    Left = 151
    Top = 8
    Width = 137
    Height = 89
    BevelOuter = bvSpace
    TabOrder = 1
    object RadioButton4: TRadioButton
      Left = 15
      Top = 9
      Width = 113
      Height = 17
      Caption = 'Tekst'
      Checked = True
      TabOrder = 0
      TabStop = True
    end
    object RadioButton5: TRadioButton
      Left = 15
      Top = 27
      Width = 113
      Height = 17
      Caption = 'Liczba'
      TabOrder = 1
    end
    object RadioButton6: TRadioButton
      Left = 15
      Top = 44
      Width = 113
      Height = 17
      Caption = 'Waluta zloty'
      TabOrder = 2
    end
    object RadioButton7: TRadioButton
      Left = 15
      Top = 64
      Width = 113
      Height = 17
      Caption = 'Data sql'
      TabOrder = 3
    end
  end
end
procedure TForm3802.EdiustawiCOLExcelClick(Sender: TObject);
begin
  sGrid2.Cells[sGrid2.Col,1]:=Form38021.Execute(sGrid2.Cells[sGrid2.Col,1]);
end;
0

Rozwiązanie działa poprawnie. Wielkie dzięki działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1