Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cambio del valor S N en un RadioButton (https://www.clubdelphi.com/foros/showthread.php?t=97601)

jafera 23-07-2025 17:18:40

Cambio del valor S N en un RadioButton
 
Buenas tardes.


Después de mucho tiempo sin entrar por estos lares, he retomado un poco la programación de una de mis aplicaciones para obtener una mejora en un cambio de valor de un campo mediante un DBRadioButton.


He probado el código en varios eventos, OnClick, OnExit en el OnChange del campo de la tablay el resultado no es el esperado.
El código es este:


Código Delphi [-]
procedure TF_Curses.DBRadioGroup4Exit(Sender: TObject);
begin
        F_ModulDades.CursesAux.Close;
        F_ModulDades.CursesAux.Open;
        F_ModulDades.CursesAux.Last;
        F_ModulDades.CursesAux.First;
        if F_ModulDades.CursesSUSPESA.Value='N' then
        begin
                if MessageDlg('Segur que vols marcar aquesta cursa com a suspesa?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
                begin
                        If ((F_ModulDades.CursesFEDERACIO.Value ='CATALANA') and (F_ModulDades.CursesPAGA.Value ='S')) or ((F_ModulDades.CursesFEDERACIO.Value ='NACIONAL') and (F_ModulDades.CursesPAGA.Value ='S')) then
                        begin
                                while Not F_ModulDades.CursesAux.Eof do
                                begin
                                        F_ModulDades.CursesAux.Edit;
                                        F_ModulDades.CursesAuxIMP_CANON.Value:=0;
                                        F_ModulDades.CursesAuxARBITRATGE.Value:=F_ModulDades.Imp_CanonSUSPESA.Value;
                                        F_ModulDades.CursesAuxQUILOMETRES.Value:=0;
                                        F_ModulDades.CursesAuxDIETA.Value:=0;
                                        F_ModulDades.CursesAux.Post;
                                        F_ModulDades.CursesAux.Next;
                                end;
                                F_ModulDades.CursesSUSPESA.Value:='S';
                        end;
                end
                else
                begin
                        F_ModulDades.CursesSUSPESA.Value:='N';
                end;
        end
        else
        begin
                if MessageDlg('Segur que vols marcar aquesta cursa com a no suspesa?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
                begin
                        If ((F_ModulDades.CursesFEDERACIO.Value ='CATALANA') and (F_ModulDades.CursesPAGA.Value ='S')) or ((F_ModulDades.CursesFEDERACIO.Value ='NACIONAL') and (F_ModulDades.CursesPAGA.Value ='S')) then
                        begin
                                while Not F_ModulDades.CursesAux.Eof do
                                begin
                                        F_ModulDades.CursesAux.Edit;
                                        if (F_ModulDades.CursesAuxFUNCIO.Value = 'Aspirant en pràctiques') or (F_ModulDades.CursesAuxFUNCIO.Value = 'Auxiliar Arbitral') then
                                        begin
                                                F_ModulDades.CursesAuxIMP_CANON.Value:=0;
                                                F_ModulDades.CursesAuxARBITRATGE.Value:=F_ModulDades.Imp_CanonAUXILIAR.Value;
                                                F_ModulDades.CursesAuxQUILOMETRES.Value:=0;
                                                F_ModulDades.CursesAuxDIETA.Value:=0;
                                        end                                             else
                                        if F_ModulDades.CursesAuxFUNCIO.Value = 'Informàtic/a' then
                                        begin
                                                F_ModulDades.CursesAuxARBITRATGE.Value:=F_ModulDades.Imp_CanonINFORMATIC.Value;
                                                F_ModulDades.CursesAuxQUILOMETRES.Value:=F_ModulDades.Imp_CanonQUILOMETRES.Value;
                                                F_ModulDades.CursesAuxDIETA.Value:=F_ModulDades.Imp_CanonDIETA.Value;
                                        end
                                        else
                                        begin
                                                F_ModulDades.CursesAuxARBITRATGE.Value:=F_ModulDades.Imp_CanonARBITRATGE.Value;
                                                F_ModulDades.CursesAuxQUILOMETRES.Value:=F_ModulDades.Imp_CanonQUILOMETRES.Value;
                                                F_ModulDades.CursesAuxDIETA.Value:=F_ModulDades.Imp_CanonDIETA.Value;
                                        end;
                                        F_ModulDades.CursesAux.Post;
                                        F_ModulDades.CursesAux.Next;
                                end;
                        end
                        else
                        begin
                                F_ModulDades.CursesAux.Edit;
                                F_ModulDades.CursesAuxIMP_CANON.Value:=0;
                                F_ModulDades.CursesAuxARBITRATGE.Value:=0;
                                F_ModulDades.CursesAuxQUILOMETRES.Value:=0;
                                F_ModulDades.CursesAuxDIETA.Value:=0;
                                F_ModulDades.CursesAux.Post;
                                F_ModulDades.CursesAux.Next;
                        end;
                        F_ModulDades.CursesSUSPESA.Value:='N';
                end
                else
                        F_ModulDades.CursesSUSPESA.Value:='S';
        end;
end;


Lo que quiero conseguir es que cambiando el valor de un DBRadioButton entre S o N, me pregunte si quiero hacerlo y en caso afirmativo pase el código, pero en caso negativo no pase el código.


Tanto en el OnClick como en el OnExit funciona bien pero no me cambia el valor S o N
En el Onchange del campo, entra en un bucle infinito.


Si alguien tiene una idea que me pueda iluminar, pues agradecido de antemano como siempre.


Saludos


Josep Antoni

emailx45 04-08-2025 00:38:01

TEST IS WORKS FOR YOU!...

prueba para ver si te funciona https :// i.ibb.co / Kp5dXDGT / bds-Zz1g8-Sz-Gzh . gif

Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  FireDAC.Stan.Intf,
  FireDAC.Stan.Option,
  FireDAC.Stan.Param,
  FireDAC.Stan.Error,
  FireDAC.DatS,
  FireDAC.Phys.Intf,
  FireDAC.DApt.Intf,
  Data.DB,
  Vcl.StdCtrls,
  Vcl.DBCtrls,
  Vcl.Grids,
  Vcl.DBGrids,
  FireDAC.Comp.DataSet,
  FireDAC.Comp.Client,
  Vcl.ExtCtrls,
  Vcl.Buttons,
  Vcl.Menus;

type
  TForm1 = class( TForm )
    FDMemTable1: TFDMemTable;
    DBGrid1: TDBGrid;
    FDMemTable1MyDBCheckField: TBooleanField;
    DBCheckBox1: TDBCheckBox;
    DataSource1: TDataSource;
    DBNavigator1: TDBNavigator;
    PopupMenu1: TPopupMenu;
    SI1: TMenuItem;
    No1: TMenuItem;
    procedure DBCheckBox1Click( Sender: TObject );
    procedure SI1Click( Sender: TObject );
    procedure No1Click( Sender: TObject );
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  LChecked: boolean;

procedure TForm1.DBCheckBox1Click( Sender: TObject );
begin
  LChecked := DBCheckBox1.Checked;
  //
  PopupMenu1.Popup( Mouse.CursorPos.x, Mouse.CursorPos.Y );
end;

procedure TForm1.No1Click( Sender: TObject );
begin
  DBCheckBox1.Checked := LChecked;
  DBGrid1.DataSource.DataSet.Cancel;
end;

procedure TForm1.SI1Click( Sender: TObject );
begin
  if ( DBGrid1.DataSource.DataSet.State in [ dsEdit, dsInsert ] ) then
    DBGrid1.DataSource.DataSet.Post;
end;

end.

emailx45 04-08-2025 01:11:58

FMX ---> Gif sample: https :// i.ibb.co / 5h3SKYqd / bds-SBj-Pf0-P5-Rn . gif

Código Delphi [-]
type
  TForm1 = class( TForm )
    RadioButton1: TRadioButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    PopupMenu1: TPopupMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    procedure RadioButton1MouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single );
    procedure MenuItem1Click( Sender: TObject );
    procedure MenuItem2Click( Sender: TObject );
  private
...

procedure TForm1.MenuItem1Click( Sender: TObject );
begin
  RadioButton1.IsChecked := true;
  ShowMessage( 'Si' )
end;

procedure TForm1.MenuItem2Click( Sender: TObject );
begin
  RadioButton1.IsChecked := false;
  ShowMessage( 'No' )
end;

procedure TForm1.RadioButton1MouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single );
begin
  PopupMenu1.Popup( Screen.MousePos.X, Screen.MousePos.Y );
end;

emailx45 04-08-2025 01:25:41

En lugar de usar el método clásico de escanear todos los registros de una tabla con un "WHILE/REPEAT...", utilice una sentencia SQL más eficiente y rápida.

SQL Text => IBQuery, FDQuery, TQuery, UniQuery, etc.. etc.. etc...

' UPDATE <<TABLE>> '
' SET <<Field1 = ValueABC, <<Field2= ValueABC, etc... etc... >>'
' WHERE <<FieldX = XXXXX .... etc. ... etc... >>>

example:

Código Delphi [-]
  try
    try
      if not FDConnection1.InTransaction then
        FDConnection1.StartTransaction;
        //
      FDQuery1.ExecSQL( 'INSERT / DELETE / UPDATE  .......' );
    except
      on E:Exception do
        ShowMessage(E.Message);
    end;
  finally
    if FDConnection1.InTransaction then
      FDConnection1.Commit;
  end;

UPDATE MyTable
SET Name="John", Age=18
Where ((FieldA ='CATALANA') or (FieldA ='NACIONAL')) and (FieldB ='S')


La franja horaria es GMT +2. Ahora son las 18:25:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi