Раньше был dbedit в delphi (а в Multiplatform нет)

Раньше был dbedit delphi сейчас edit, но когда привязываю визуально его к проеденным данным, потом из перемененной, вставляю данные в edit. Однако в таблице они не отображающийся, поэтому с помощью:

Form2.FDQuery1.DataSource.DataSet.Post;

не удается сохранить. Подскажите пожалуйста как сделать так, чтобы отображались как при обычном ведении с клавиатуры.

Так а зачем менять было?) Или и там не работало?

1 лайк

Я имею ввиду, что в delphi есть, а в multiplatform delphi нет dbedit вообще, как компонента.

В событии по выходу из эдита или по клику по кнопке проверить чего там введено, по крайней мере на пустоту, тебе видней что проверять будешь, и если все ок, то insert в датасет, на который грид нацелен и записать в нужное поле датасета. post само собой

1 лайк

Вот здесь весь код


вот кусочек кода

if (label4.Text<>'') and (label3.Text<>'') and (label3.Text.Length<>0) and (label4.Text.Length<>0) then
d:=strtoint(label4.Text);
case d of
0:begin

FDQuery1.Insert;
label5.Text:=inttostr(d);
edit2.Text:=S1;
label3.Text:='';
label4.Text:='';
end;

100:begin
label5.Text:=inttostr(d);
edit3.Text:=S1;
edit4.Text:='User';
label3.Text:='';
label4.Text:='';

if (Form2.Change(S1)=true) and (edit2.Text<>'') and (edit3.Text<>'') and (edit3.Text.Length<>0) and (edit2.Text.Length<>0) then
begin
FDQuery1.Post;
end
else
begin
edit2.Text:='';
edit3.Text:='';
edit4.Text:='';
end;
end;
end;
End;
end.

Проверьте для начала, что строка кода с Post вызывается (отладочная печать или MessageBox или breakpoint отладчика).


Change очень странное для имя функции сравнивающей пароль с паролем из БД.
Это скорее CheckPassword или IsCorrectPassword.

… хотя может я вообще не понял что функция должна была делать )
Если проверять, что пароль новый, то что-то типа IsPasswordChanged. Changed (изменен), а не Change (изменить) потому что она ж не меняет его.

А, :sweat_smile:, я наконец понял, она ищет пользователя в БД (FindUser, …). Но там какая-то странная проверка едита потом, в котором непонятно что.

Вот поэтому и надо придумывать понятные имена.


И это лишнее, оно и так bool

И тут первое условие лишнее при наличии второго

Ну и с такими именами очень сложно понять код.
Надо называть так, чтоб имя описывало сущность/действие, и придерживаться какого-то стиля и устоявщихся рекомендаций.
https://ru.hexlet.io/blog/posts/naming-in-programming
https://ru.hexlet.io/blog/posts/naming-errors-1

1 лайк

если пользователь с таким именем есть то пользователь не попадает в базу данных если нет то записывает пользователя.

Так а зачем там проверка S1<>edit2.Text? Наверно надо было просто вернуть результат Locate.

Это кстати тоже можно сократить до

Result := a <> b; // или Result := ...Locate(...);

вместо

if a <> b then
  Result := true
else
  Result := false;
1 лайк

И в locate убрать lopartialkey, это поиск по началу строки. А то для юзера user1 найдет и user11. Вместо этого нужен регистонезависимый поиск, там есть какая-то константа для этого

1 лайк

тут немного изменил имена так, чтобы отражали суть:

unit yadro;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IdUDPClient,
  IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, FMX.StdCtrls, FMX.Edit,
  FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, IdGlobal, IdSocketHandle,
  FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf,
  FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Phys, FireDAC.Stan.Pool,
  FireDAC.Stan.Async, FireDAC.Phys.MSAcc, FireDAC.Phys.MSAccDef,
  FireDAC.FMXUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf,
  FireDAC.DApt, System.Rtti, FMX.Grid.Style, Data.Bind.EngExt,
  Fmx.Bind.DBEngExt, Fmx.Bind.Grid, System.Bindings.Outputs, Fmx.Bind.Editors,
  Data.Bind.Components, Data.Bind.Grid, Data.Bind.DBScope, FMX.Grid, Data.DB,
  FireDAC.Comp.DataSet, FireDAC.Comp.Client;

type
  TForm2 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    IdUDPServer1: TIdUDPServer;
    Server_On: TButton;
    Server_Off: TButton;
    Label2: TLabel;
    Timer1: TTimer;
    FDConnection1: TFDConnection;
    FDQuery1: TFDQuery;
    DataSource1: TDataSource;
    StringGrid1: TStringGrid;
    BindSourceDB1: TBindSourceDB;
    BindingsList1: TBindingsList;
    LinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource;
    Isert: TButton;
    Post: TButton;
    delete: TButton;
    Button7: TButton;
    loginbind: TEdit;
    passwordbind: TEdit;
    Groupebind: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Timer2: TTimer;
    LinkControlToField1: TLinkControlToField;
    LinkControlToField2: TLinkControlToField;
    LinkControlToField3: TLinkControlToField;
    LinkControlToField4: TLinkControlToField;
    Label3: TLabel;
    Label4: TLabel;
    procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
      const AData: TIdBytes; ABinding: TIdSocketHandle);
    procedure Server_OnClick(Sender: TObject);
    procedure Server_OffClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure IsertClick(Sender: TObject);
    procedure PostClick(Sender: TObject);
    procedure deleteClick(Sender: TObject);
    procedure Openstr();
    procedure Closestr();

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  S:string;
  text,comand,comandtext:String;
  d:integer;
  SD:boolean;
implementation

{$R *.fmx}

procedure TForm2.Server_OnClick(Sender: TObject);
begin
  Form2.IdUDPServer1.Active:=true;
end;

procedure TForm2.Server_OffClick(Sender: TObject);
begin
Form2.IdUDPServer1.Active:=false;
end;

procedure TForm2.IsertClick(Sender: TObject);
begin
FDQuery1.Insert;
end;

procedure TForm2.PostClick(Sender: TObject);
begin
FDQuery1.Post;
end;

procedure TForm2.deleteClick(Sender: TObject);
begin
FDQuery1.Delete;
end;



procedure TForm2.Closestr;
begin
FDQuery1.Post;
end;

procedure TForm2.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
  var
    ss:TStringStream; //сохранять буквы будем тут
  s,buff:String; //вспомогательные переменные
begin
      ss:=TStringStream.create(''); //создаем пустую строку
    ss.write(adata[0],length(adata)); //записываем в нее данные из потока байт
    s:=ss.DataString; //преобразовываем ее в текст
     ss:=TStringStream.create(''); //создаем пустую строку
    ss.write(adata[0],length(adata)); //записываем в нее данные из потока байт
    s:=ss.DataString; //преобразовываем ее в текст
      Memo1.Lines.Add(s);  // если кракоз¤бры то пробуем Utf8ToAnsi и т д (но у мен¤ и так работает)
      ss.free;//очищаем строку от мусора
       comandtext:=s;
      comand:=s;
      text:=s;
      delete(text,1,4);
      delete(comand,5,Length(comand));


end;



procedure TForm2.Openstr;
begin
FDQuery1.Insert;
end;

procedure TForm2.Timer1Timer(Sender: TObject);


begin


if form2.IdUDPServer1.Active=true then
begin

  label2.Text:='Server On - port 8488';
end
else
   label2.Text:='Server Off';
end;
procedure TForm2.Timer2Timer(Sender: TObject);

begin
 label3.Text:=text;
label4.Text:=comand;
if  (comand.Length<>0) and (text.Length<>0) then
begin
d:=strtoint(comand);
case d of
1000:begin

FDQuery1.Insert;

loginbind.Text:=text;
text:='';
comand:='';
end;

1001:begin
label3.Text:=text;
label4.Text:=comand;
passwordbind.Text:=text;
groupebind.Text:='User';
text:='';
comand:='';

if (FDQuery1.DataSource.DataSet.Locate('Login',text,[])=true) then
begin
FDQuery1.DataSource.DataSet.Post;
end
else
begin
loginbind.Text:='';
passwordbind.Text:='';
groupebind.Text:='';
end;
end;
end;
end;
End;
end.

+1

Дык
loCaseInsensitive
Регистр букв не учитывается

@виталий_Соловьёв, не надо так писать. не надо сравнивать значение с true
достаточно просто указать значение логической переменной или функции:

if FDQuery1.DataSource.DataSet.Locate('Login',text,[]) then

Я не сравниваю true я выясняю являться ли результат функции true

if Функция() = True then

это и есть проверить "Равно ли значение функции True "
вместо этого в Pascal/Delphi нужно писать

if Функция() then
1 лайк

немного изменил код

unit yadro;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IdUDPClient,
  IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, FMX.StdCtrls, FMX.Edit,
  FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, IdGlobal, IdSocketHandle,
  FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf,
  FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Phys, FireDAC.Stan.Pool,
  FireDAC.Stan.Async, FireDAC.Phys.MSAcc, FireDAC.Phys.MSAccDef,
  FireDAC.FMXUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf,
  FireDAC.DApt, System.Rtti, FMX.Grid.Style, Data.Bind.EngExt,
  Fmx.Bind.DBEngExt, Fmx.Bind.Grid, System.Bindings.Outputs, Fmx.Bind.Editors,
  Data.Bind.Components, Data.Bind.Grid, Data.Bind.DBScope, FMX.Grid, Data.DB,
  FireDAC.Comp.DataSet, FireDAC.Comp.Client;

type
  TForm2 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    IdUDPServer1: TIdUDPServer;
    Server_On: TButton;
    Server_Off: TButton;
    Label2: TLabel;
    Timer1: TTimer;
    FDConnection1: TFDConnection;
    FDQuery1: TFDQuery;
    DataSource1: TDataSource;
    StringGrid1: TStringGrid;
    BindSourceDB1: TBindSourceDB;
    BindingsList1: TBindingsList;
    LinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource;
    Isert: TButton;
    Post: TButton;
    delete: TButton;
    Button7: TButton;
    loginbind: TEdit;
    passwordbind: TEdit;
    Groupebind: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Timer2: TTimer;
    LinkControlToField1: TLinkControlToField;
    LinkControlToField2: TLinkControlToField;
    LinkControlToField3: TLinkControlToField;
    LinkControlToField4: TLinkControlToField;
    Label3: TLabel;
    Label4: TLabel;
    procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
      const AData: TIdBytes; ABinding: TIdSocketHandle);
    procedure Server_OnClick(Sender: TObject);
    procedure Server_OffClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure IsertClick(Sender: TObject);
    procedure PostClick(Sender: TObject);
    procedure deleteClick(Sender: TObject);
    procedure Openstr();
    procedure Closestr();
    procedure loginbindChange(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  S:string;
  text,comand,comandtext:String;
  d:integer;
  LoginNofind:boolean;
implementation

{$R *.fmx}

procedure TForm2.Server_OnClick(Sender: TObject);
begin
  Form2.IdUDPServer1.Active:=true;
end;

procedure TForm2.Server_OffClick(Sender: TObject);
begin
Form2.IdUDPServer1.Active:=false;
end;

procedure TForm2.IsertClick(Sender: TObject);
begin
FDQuery1.Insert;
end;

procedure TForm2.loginbindChange(Sender: TObject);
begin
if (FDQuery1.DataSource.DataSet.Locate('Login',text,[loCaseInsensitive])) then
begin
D:=1002;
LoginNofind:=true;
end
else
begin
loginbind.Text:='';
passwordbind.Text:='';
groupebind.Text:='';
end;
end;

procedure TForm2.PostClick(Sender: TObject);
begin
FDQuery1.Post;
end;

procedure TForm2.deleteClick(Sender: TObject);
begin
FDQuery1.Delete;
end;



procedure TForm2.Closestr;
begin
FDQuery1.Post;
end;

procedure TForm2.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
  var
    ss:TStringStream; //сохранять буквы будем тут
  s,buff:String; //вспомогательные переменные
begin
      ss:=TStringStream.create(''); //создаем пустую строку
    ss.write(adata[0],length(adata)); //записываем в нее данные из потока байт
    s:=ss.DataString; //преобразовываем ее в текст
     ss:=TStringStream.create(''); //создаем пустую строку
    ss.write(adata[0],length(adata)); //записываем в нее данные из потока байт
    s:=ss.DataString; //преобразовываем ее в текст
      Memo1.Lines.Add(s);  // если кракоз¤бры то пробуем Utf8ToAnsi и т д (но у мен¤ и так работает)
      ss.free;//очищаем строку от мусора
       comandtext:=s;
      comand:=s;
      text:=s;
     delete(text,1,4);
      delete(comand,5,Length(comand));

появились ошибки.

Checking project dependencies...
Compiling Server.dproj (Debug, Win64)
dcc64 command line for "Server.dpr"
  c:\program files (x86)\embarcadero\studio\20.0\bin\dcc64.exe -$O- -$W+ --no-config -M -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;
  Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG 
  -E.\Win64\Debug -I"c:\program files (x86)\embarcadero\studio\20.0\lib\Win64\debug";"c:\program files (x86)\embarcadero\studio\20.0\lib\Win64\release";
  C:\Users\Arthas\Documents\Embarcadero\Studio\20.0\Imports;"c:\program files (x86)\embarcadero\studio\20.0\Imports";
  C:\Users\Public\Documents\Embarcadero\Studio\20.0\Dcp\Win64;"c:\program files (x86)\embarcadero\studio\20.0\include" 
  -LEC:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl\Win64 -LNC:\Users\Public\Documents\Embarcadero\Studio\20.0\Dcp\Win64 -NU.\Win64\Debug 
  -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;System;Xml;Data;Datasnap;Web;Soap; -O"c:\program files 
  (x86)\embarcadero\studio\20.0\lib\Win64\release";C:\Users\Arthas\Documents\Embarcadero\Studio\20.0\Imports;"c:\program files 
  (x86)\embarcadero\studio\20.0\Imports";C:\Users\Public\Documents\Embarcadero\Studio\20.0\Dcp\Win64;"c:\program files 
  (x86)\embarcadero\studio\20.0\include" -R"c:\program files (x86)\embarcadero\studio\20.0\lib\Win64\release";
  C:\Users\Arthas\Documents\Embarcadero\Studio\20.0\Imports;"c:\program files (x86)\embarcadero\studio\20.0\Imports";
  C:\Users\Public\Documents\Embarcadero\Studio\20.0\Dcp\Win64;"c:\program files (x86)\embarcadero\studio\20.0\include" -U"c:\program files 
  (x86)\embarcadero\studio\20.0\lib\Win64\debug";"c:\program files (x86)\embarcadero\studio\20.0\lib\Win64\release";
  C:\Users\Arthas\Documents\Embarcadero\Studio\20.0\Imports;"c:\program files (x86)\embarcadero\studio\20.0\Imports";
  C:\Users\Public\Documents\Embarcadero\Studio\20.0\Dcp\Win64;"c:\program files (x86)\embarcadero\studio\20.0\include" -V -VN -VR 
  -NBC:\Users\Public\Documents\Embarcadero\Studio\20.0\Dcp\Win64 -NHC:\Users\Public\Documents\Embarcadero\Studio\20.0\hpp\Win64 -NO.\Win64\Debug  
  Server.dpr   
[dcc64 Hint] yadro.pas(133): H2164 Variable 'buff' is declared but never used in 'TForm2.IdUDPServer1UDPRead'
[dcc64 Error] yadro.pas(175): E2066 Missing operator or semicolon
[dcc64 Error] yadro.pas(176): E2066 Missing operator or semicolon
[dcc64 Error] yadro.pas(176): E2014 Statement expected, but expression of type 'TButton' found
[dcc64 Fatal Error] panelupravlenia.pas(27): F2063 Could not compile used unit 'yadro.pas'

пишет же, что в строке 175 отсутствует оператор или точка с запятой. Этой самой 175-ой строки и нет в приведенном фрагменте )

1 лайк

выделяет вот эту строку
delete(text,1,4);

а что такое переменная text ?
Вы бы целиком yadro.pas выложили. потому что номер строки ошибки не совпадает с текстом программы, который Вы привели.

1 лайк

Поменяй имя кнопки. В строке delete(text,1,4) компилятор думает, что обращение к объекту, а не к процедуре

add да и отлаживать таким образом будешь до второго потопа )

2 лайка

Весь проект (сервер - клиент)