problem ze znikającymi polami

0

Witam.

Mam do zrobienia program (na jutro :D) który ma być identyczny jak ten - http://wrzucacz.pl/file/8201300361092

Zaczałem się bawić znikającymi polami i mam teraz taki kod:

unit droganasza;

interface

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

type
 TForm1 = class(TForm)
   CheckBox1: TCheckBox;
   Edit1: TEdit;
   Label1: TLabel;
   Edit2: TEdit;
   Edit3: TEdit;
   Edit4: TEdit;
   Label2: TLabel;
   Label3: TLabel;
   Label4: TLabel;
   Button1: TButton;
   Edit5: TEdit;
   Label5: TLabel;
   RadioGroup1: TRadioGroup;
   procedure CheckBox1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}





procedure TForm1.CheckBox1Click(Sender: TObject);
begin

 if ( RadioGroup1.ItemIndex = 0 ) then
 if ( CheckBox1.Checked ) then

 Edit1.Visible:=true
 else
 Edit1.Visible:=false;

 if ( RadioGroup1.ItemIndex = 1 ) then
 if ( CheckBox1.Checked ) then

 Edit2.Visible:=true
 else
 Edit2.Visible:=false;

end;

end.

Wg mnie powinno działać to tak, że jezeli mamy zaznaczonego radiogroup0 (czyli tego 1) i zaznaczonego chceckboxa to powinno nam sie pojawić pole Edit1, a jeżeli sobie klikniemy na radiogroup1 (czyli ten drugi) to pole edit1 powinno nam zniknąć, a pole edit2 się pojawić. Niestety tak się nie dzieje. Ma ktoś pomysł jak to rozwiązać?

Być może to jest tak proste, ze ktoś pomogłby w jeszcze większym zakresie.

Pozdrawiam.

0

A robisz tak, że najpierw wybierasz z radiogroup a potem z check'a ?

0

Edit1.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 0);
Edit2.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);

0

Dzięki za szybką odpowiedz,
stworzyłem:

procedure TForm1.CheckBox1Click(Sender: TObject);
begin

Edit1.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 0);
Edit2.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);

end;


procedure TForm1.RadioGroup1Click(Sender: TObject);
begin

 if ( RadioGroup1.ItemIndex = 0 ) then
   Edit1.Visible:=(CheckBox1.Checked);
 if ( RadioGroup1.ItemIndex = 1 ) then
   Edit2.Visible:=(CheckBox1.Checked);

end;

prawie dziala, tylko nie chca zniknac po pojawieniu sie pola w radiogrupie..

0

Albo w RadioGroup1 zdarzenie OnClick wstaw CheckBox1Click,
albo w RadioGroup1Click wpisz to samo co masz w CheckBox1Click.

0
procedure TForm1.CheckBox1Click(Sender: TObject);
begin

Edit1.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 0);
Edit1.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);
Edit2.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);

end;


procedure TForm1.RadioGroup1Click(Sender: TObject);
begin

Edit1.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 0);
Edit1.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);
Edit2.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);

end;

end.

Dzieki, tak jak opsiałem wyżej to działa elegancko. Tylko, że nie zauwazyłem, ze jezeli 1 radiogoup jest zaznaczony i ten checkbox to ma byc widoczne edit1.
Jezeli radiogroup2 jest zazanczony i checkbox to ma byc widoczne i Edit1 i Edit2.
jeszcze jakbys to rozwiazał to już by było tak jak powinno.

Z gory dzieki

1

Masz możliwych 4 warianty:
Check oraz Radio=0
Check oraz Radio=1
UnCheck oraz Radio=0
UnCheck oraz Radio=1
przypisz do każdego przypadku co ma być widoczne.

0

Wtedy dziala, ze raz sie pojawia pole edit, a raz pole edit2 :) a w przypadku klikniecia RadioGroup1.ItemIndex = 1 i zaznaczenia checkboxa to maja byc widoczne i Edit1 i Edit2.
Zgadza się. Wtedy dziala, ze raz sie pojawia pole edit1, a raz pole edit2, a ma być tak, że w przypadku klikniecia RadioGroup1.ItemIndex = 1 i zaznaczenia checkboxa to maja byc widoczne i Edit1 i Edit2.

0
_13th_Dragon napisał(a)

Masz możliwych 4 warianty:
Check oraz Radio=0
Check oraz Radio=1
UnCheck oraz Radio=0
UnCheck oraz Radio=1
przypisz do każdego przypadku co ma być widoczne.

Wiem o co chodzi ale nie wiem gdzie tu mam ustawić true i false...

0

O jejku jejeczku :P Takie banały, przecież dostałeś już tyle podpowiedzi i dalej nie ogarniasz, to po co szedłeś na uczelnie czy szkołę gdzie masz mieć do czynienia z programowaniem. Zawsze mi się takie nasuwa pytanie. A poza tym zadania zaliczeniowe zadaje się i wykonuje odpowiednio wcześniej, a nie na ostatnią chwilę. Masz kod poniżej, teraz wszystko powinno być jasne.

//...
procedure TForm1.FormCreate(Sender : TObject);
begin
  DrogaRG.ItemIndex := 0;
  StanPoczCbx.Checked := False;
end;

procedure TForm1.DrogaRGClick(Sender : TObject);
var
  RG : TRadioGroup;
begin
  RG := TRadioGroup(Sender);
  case RG.ItemIndex of
    0 :
      begin
        S0Edit.Visible := StanPoczCbx.Checked;
        V0Edit.Visible := False;
      end;
    1 :
      begin
        S0Edit.Visible := StanPoczCbx.Checked;
        V0Edit.Visible := StanPoczCbx.Checked;
      end;
  end;
end;

procedure TForm1.StanPoczCbxClick(Sender : TObject);
var
  RG : TRadioGroup;
begin
  RG := DrogaRG;
  case RG.ItemIndex of
    0 :
      begin
        S0Edit.Visible := StanPoczCbx.Checked;
        V0Edit.Visible := False;
      end;
    1 :
      begin
        S0Edit.Visible := StanPoczCbx.Checked;
        V0Edit.Visible := StanPoczCbx.Checked;
      end;
  end;
end;
0

Olesio to co napisałeś to straszne. to samo da się zrobić w 3 wierszy:

procedure TForm1.FormCreate(Sender : TObject);
begin
   DaneClick(nil);
end;
 
procedure TForm1.DaneClick(Sender : TObject); // tu podpięte RadioGroup1.OnChange oraz CheckBox1.OnClick
begin
  Edit1.Visible:=CheckBox1.Checked;
  Edit2.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex>0);
end;
0

No na szybko to pisałem to nie pomyślałem jak to zrobić najoptymalniej, a zmiennej rzutującej na Sener używam celowo żeby nie pisać później wiele razy TCostam(Sender)... bo za taką konstrukcją nie przepadam. Ale powyższe nie zmienia faktu, że pytający powinien wpaść na coś podobnego już po Twoich wcześniejszych odpowiedziach.

0

Witam ponownie,
aktualnie moje zadanie jest w następującym stadium: http://wrzucacz.pl/file/1661300440030
przypominam, że ma wyglądać identycznie jak to: http://wrzucacz.pl/file/8201300361092

Aktualnie mam problem z komunikatami i z obliczeniami, bo działa dla ruchu jednostajnego jak jest checkbox wlaczony a ma dziala tez w pozostalych 3 wariantach,
poza tym mam problem z przypisaniem skrótów klawiszowych.


unit droganasza;

interface

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

type
  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button1: TButton;
    Edit5: TEdit;
    Label5: TLabel;
    RadioGroup1: TRadioGroup;
    Label6: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure CheckBox1Click(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if ( not( Key in ['0'..'9',DecimalSeparator,#8,'-'] )) then Key:=#0
end;


procedure TForm1.CheckBox1Click(Sender: TObject);
begin

  Edit1.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 0);
  Label6.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 0);

  Edit4.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);
  Edit6.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);
  Label7.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);
  Label2.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);


end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin

  Edit1.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 0);
  Edit2.Visible:=(RadioGroup1.ItemIndex = 0);
  Edit3.Visible:=(RadioGroup1.ItemIndex = 0);
  Label6.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 0);
  Label3.Visible:=(RadioGroup1.ItemIndex = 0);
  Label4.Visible:=(RadioGroup1.ItemIndex = 0);

  Edit4.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);
  Edit6.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);
  Edit7.Visible:=(RadioGroup1.ItemIndex = 1);
  Edit8.Visible:=(RadioGroup1.ItemIndex = 1);
  Label7.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);
  Label2.Visible:=(CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1);
  Label8.Visible:=(RadioGroup1.ItemIndex = 1);
  Label9.Visible:=(RadioGroup1.ItemIndex = 1);

end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s01, t1, v1, s02, v02, t2, v2, a2, jednostajny, jednostajny2, przyspieszony2, przyspieszony: Real;
begin

    if (CheckBox1.Checked)and(RadioGroup1.ItemIndex = 0) then
    if ( Edit1.Text='') then begin
    Application.MessageBox('Brak parametru s0', 'Informacja', MB_OK+MB_ICONError);
    Edit1.SetFocus; end;
    if ( Edit2.Text='') then begin
    Application.MessageBox('Brak parametru t', 'Informacja', MB_OK+MB_ICONError);
    Edit2.SetFocus; end;
    if ( Edit3.Text='') then begin
    Application.MessageBox('Brak parametru v', 'Informacja', MB_OK+MB_ICONError);
    Edit3.SetFocus; end

    else begin
    s01 := StrToFloat(Edit1.Text);
    t1 := StrToFloat(Edit2.Text);
    v1 := StrToFloat(Edit3.Text);
    jednostajny2 := s01*t1+v1;
    Edit5.Text := FloatToStr (jednostajny2);
    end;

    if (RadioGroup1.ItemIndex = 0) then
    if ( Edit2.Text='') then begin
    Application.MessageBox('Brak parametru t', 'Informacja', MB_OK+MB_ICONError);
    Edit2.SetFocus; exit; end;
    if ( Edit3.Text='') then begin
    Application.MessageBox('Brak parametru v', 'Informacja', MB_OK+MB_ICONError);
    Edit3.SetFocus; exit; end
    else begin
    t1 := StrToFloat(Edit2.Text);
    v1 := StrToFloat(Edit3.Text);
    jednostajny := t1*v1;
    Edit5.Text := FloatToStr (jednostajny);
    end;

    if (CheckBox1.Checked)and(RadioGroup1.ItemIndex = 1) then
    if ( Edit4.Text='') then begin
    Application.MessageBox('Brak parametru s0', 'Informacja', MB_OK+MB_ICONError);
    Edit4.SetFocus; exit; end;
    if ( Edit6.Text='') then begin
    Application.MessageBox('Brak parametru v0', 'Informacja', MB_OK+MB_ICONError);
    Edit6.SetFocus; exit; end;
    if ( Edit7.Text='') then begin
    Application.MessageBox('Brak parametru t', 'Informacja', MB_OK+MB_ICONError);
    Edit7.SetFocus; exit; end;
    if ( Edit8.Text='') then begin
    Application.MessageBox('Brak parametru a', 'Informacja', MB_OK+MB_ICONError);
    Edit8.SetFocus; exit; end

    else begin
    s02 := StrToFloat(Edit4.Text);
    v02 := StrToFloat(Edit6.Text);
    t2 := StrToFloat(Edit7.Text);
    a2 := StrToFloat(Edit8.Text);
    przyspieszony2 := s02+(v02*t2)+(a2*sqr(t2)/2);
    Edit5.Text := FloatToStr (przyspieszony2);
    end;

    if (RadioGroup1.ItemIndex = 1) then
    if ( Edit7.Text='') then begin
    Application.MessageBox('Brak parametru t', 'Informacja', MB_OK+MB_ICONError);
    Edit7.SetFocus; exit; end;
    if ( Edit8.Text='') then begin
    Application.MessageBox('Brak parametru a', 'Informacja', MB_OK+MB_ICONError);
    Edit8.SetFocus; exit; end

    else begin
    t2 := StrToFloat(Edit7.Text);
    a2 := StrToFloat(Edit8.Text);
    przyspieszony := a2*sqr(t2)/2;
    Edit5.Text := FloatToStr (przyspieszony);
    end;





end;

end.


0

Ja tylko dodam, że było o skrótach klawiszowych niedawno. Można zrobić ich obsługę w OnKeyPress dla formatki jeśli komponentami nie są buttony z ustawioną &Etykietą (z &). Oczywiście wtedy KeyPress na True, ale nie wszystkie skróty mogą zadziałąć, na przykład jakieś z tabulatorem albo kursorami - nie zadziałają. Inne rozwiązanie to podpiąć PopupMenu z ukrytymi pozycjami i im przypisać odpowiedni kod oraz skrót klawiszowy. Poza tym jak chcesz ułatwić pomagającym to po pierwsze i najważniejsze formatuj swój kod (jeżeli nie umiesz robić tego samodzielnie to polecam wspomóc się tym: http://www.mediafire.com/file/80zkrt8absx60cv/delfor_changed_by_olesio.rar) i jeżeli coś wrzucasz na przykład polecam cały kod źródłowy z exe w podkatalogu to archiwum umieszczaj albo na mediafire.com (po darowym zarejestrowaniu pliki wrzucone na Twoje konto nie znikną chyba że usuniesz je Ty albo administracja jak ktoś je zgłosi, a to wątpliwe przy legalnej zawartości). Jeżeli natomiast wrzucasz na szybko i nie chcesz sie rejestrować czy logować to polecam Ci: http://www.speedyshare.com do tego celu, bo wprawdzie linki wygasną po siedmiu dniach od czasu ostatniego pobraniam, ale jest to chyba jeden z nielicznych serwisów na małe pliki, z którego ściąga się bez zbędnego czekania, oglądania reklam i wszelkich utrudniaczy.

0

jak zrobic edit tylko 10,20,30,40,50 ??

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 if CheckBox1.Checked then Edit1.Text:='10,'
 else
 Edit1.Text:='';
 Label1.Font.Color:=clred;
end;
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
 if CheckBox1.Checked then Edit1.Text:='20,'
 else
 Edit1.Text:='';
 Label1.Font.Color:=clwhite;
end;
procedure TForm1.CheckBox3Click(Sender: TObject);
begin
 if CheckBox1.Checked then Edit1.Text:='30,'
 else
 Edit1.Text:='';
 Label1.Font.Color:=cllime;
end;
0

Ja bym to rozwiązał tak, jak poniżej. I pewnie da się zrobić to też inaczej, ale o tak późnej porze już nie chce mi się nic innego wymyślać, skoro ów sposób działa.

//...
type
  TForm1 = class(TForm)
    CheckBox1 : TCheckBox;
    CheckBox2 : TCheckBox;
    CheckBox3 : TCheckBox;
    CheckBox4 : TCheckBox;
    CheckBox5 : TCheckBox;
    Edit1 : TEdit;
    procedure FormCreate(Sender : TObject);
  private
  public
    procedure CbxClick(Sender : TObject);
  end;

const
  MaxCbx = 5;
  Separator = ',';
  CbxName = 'CheckBox';

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.CbxClick(Sender : TObject);
var
  I : integer;
  Cbx : TCheckBox;
begin
  Edit1.Text := '';
  for I := 1 to MaxCbx do
  begin
    Cbx := TCheckBox(Self.FindComponent(CbxName + IntToStr(I)));
    if Cbx <> nil then
    begin
      if Cbx.Checked then
      begin
        Edit1.Text := Edit1.Text + IntToStr(Cbx.Tag) + Separator;
      end;
    end;
  end;
  if Edit1.Text <> '' then
  begin
    Edit1.Text := Copy(Edit1.Text, 1, Length(Edit1.Text) - Length(Separator));
  end;
end;

procedure TForm1.FormCreate(Sender : TObject);
var
  I : integer;
  Cbx : TCheckBox;
begin
  Edit1.Text := '';
  for I := 1 to MaxCbx do
  begin
    Cbx := TCheckBox(Self.FindComponent(CbxName + IntToStr(I)));
    if Cbx <> nil then
    begin
      Cbx.OnClick := CbxClick;
      Cbx.Checked := False;
      Cbx.Tag := I * 10;
    end;
  end;
end;

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