Delphi, Сохранение пользователей чата в БД Access

Добры день! Подскажите пожалуйста как сохранить пользователей чата в базу данных акссес вот код:

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;
    Button2: TButton;
    Button3: TButton;
    Label2: TLabel;
    Timer1: TTimer;
    FDManager1: TFDManager;
    FDConnection1: TFDConnection;
    FDQuery1: TFDQuery;
    DataSource1: TDataSource;
    StringGrid1: TStringGrid;
    BindSourceDB1: TBindSourceDB;
    BindingsList1: TBindingsList;
    LinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    LinkControlToField1: TLinkControlToField;
    LinkControlToField2: TLinkControlToField;
    LinkControlToField3: TLinkControlToField;
    LinkControlToField4: TLinkControlToField;
    Timer2: TTimer;
    Label5: TLabel;
    procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
      const AData: TIdBytes; ABinding: TIdSocketHandle);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Openstr();
    procedure Closestr();
    procedure Change();

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

var
  Form2: TForm2;
  S:string;
  s1,s2,s3:String;
  d:integer;
  SD:boolean;
implementation

{$R *.fmx}

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

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

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

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

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

procedure TForm2.Change;
begin
FDQuery1.DataSource.DataSet.Locate('Login',label3.Text,[lopartialkey]);
if  (label3.Text<>edit2.Text) then
SD:=true
else
 SD:=false;
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;//очищаем строку от мусора
       S1:=s;
      S2:=s;
      delete(S1,1,4);
      delete(S2,4,Length(S2));
      label3.Text:=S1;
      label4.Text:=S2;

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

if (label3.Text.Length<>0) and (label4.Text.Length<>0) then


Form2.Change;
if SD=true then

begin

d:=strtoint(label4.Text);
case d of
0:begin

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

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

end;
end;

End;
end;

end.

Компиляци япроходит успешно при попыте сохранить выдает вот что:

1

подозеваю чтопроблема вот в этом кусочке

FDQuery1.DataSource.DataSet.Locate('Login',label3.Text,[lopartialkey]);
if  (label3.Text<>edit2.Text) then

Потому, что когда убираю проблема исчезает, но сохранение в базу данных непроисходит по-прежнему. Появляеться пустая строка и все.
Если пробовать писать руками в эдиты все норм сохраняет.

Здесь не понятно? Т. е. если пользуем базу все ОК. Если хотим что нить изменить, тогда не верный адрес?

1 лайк

Нет. Если не руками сохраняю то все плохо. Я имею виду помощью авто нажатия Button5Click(self) или с помощью вот такой процедуры:

case d of
0:begin

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

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

end;
end;

End;

Read of 00000000..... обычно означает обращение к содержимому объекта по nil указателю где-то.

Если сразу не понятно в какой переменной nil, значит надо добавлять отладочную печать (выводить все переменные куда-нибудь) или использовать отладчик.

http://blog.algoprog.ru/how-to-debug-small-programs/

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;
    Button2: TButton;
    Button3: TButton;
    Label2: TLabel;
    Timer1: TTimer;
    FDManager1: TFDManager;
    FDConnection1: TFDConnection;
    FDQuery1: TFDQuery;
    DataSource1: TDataSource;
    StringGrid1: TStringGrid;
    BindSourceDB1: TBindSourceDB;
    BindingsList1: TBindingsList;
    LinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    LinkControlToField1: TLinkControlToField;
    LinkControlToField2: TLinkControlToField;
    LinkControlToField3: TLinkControlToField;
    LinkControlToField4: TLinkControlToField;
    Timer2: TTimer;
    Label5: TLabel;
    procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
      const AData: TIdBytes; ABinding: TIdSocketHandle);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Openstr();
    procedure Closestr();
    function Change(F:string):boolean;

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

var
  Form2: TForm2;
  S:string;
  s1,s2,s3:String;
  d:integer;
  SD:boolean;
implementation

{$R *.fmx}

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

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

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

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

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

function TForm2.Change(F:string):boolean;


begin
FDQuery1.DataSource.DataSet.Locate('Login',F,[lopartialkey]);
if  (S1<>edit2.Text) then
result:=true
else
 result:=false;
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;//очищаем строку от мусора
       S1:=s;
      S2:=s;
      delete(S1,1,4);
      delete(S2,4,Length(S2));
      label3.Text:=S1;
      label4.Text:=S2;

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

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.

Теперь, выбивает туже ошибку, после сохранения пароля

Это где? Надо давать нормальные имена переменным/контролам/функциям )

Если это тут

То видимо что-то из этого nil:

Посмотрите что там.

Если да, то может быть например к БД не подключен.

1 лайк

FDQuery1 ни где не открывается в этом фрагменте кода.

1 лайк

заметил такой косяк


Однако, не знаю поможет в этом вопросе или нет. Создал отдельную тему

Благадарю
Alex P. и Аватар в этой Alex P. в следующей Аватар