Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.10.2023, 07:56
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Восклицание Как передавать данные из listbox

Здравствуйте! вот таким образом заполняется listbox
Код:
procedure TForm1.AddToMemoCb(AFileName,Atrib:String; ASize,Aid,Arews:Integer);
begin
listbox1.Items.Add(Format('id: %d; File: %s; Size: %d; Reviews: %d; Attribute: %s',[Aid,AFileName,ASize,Arews,Atrib]));
end;
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
FileImg('G:\leon\delphis\delphi64\sql2\05\Win32\Debug\db\',AddToMemoCb);
end;
как сделать чтобы когда listbox был заполнен, что бы данные передавались в
Код:
procedure TForm1.AddToDbCb(AFileName,Atrib:String; ASize,Aid,Arews: Integer);
begin
SqlConnection1.Open;
try
  SqlQuery1.SQL.Text := 'INSERT INTO test1 (id, name, reviews, size, attribute) VALUES (:id, :name, :reviews, :size, :attribute)';
  {INSERT INTO Info (id,Cost,city)  VALUES (1,200, 'Pune'), (2, 150,'USA'), (3,345, 'France'); }
  SqlQuery1.ParamByName('id').AsInteger := Aid;
  SqlQuery1.ParamByName('name').AsString := AFileName;
  SqlQuery1.ParamByName('reviews').AsInteger := random(5);// Arews;
  SqlQuery1.ParamByName('size').AsInteger := ASize; //inttostr(imgsize);
  SqlQuery1.ParamByName('attribute').AsString := 'fff';
  SQLQuery1.ExecSQL;  Memo1.Lines.Add('Запись_добавлена='+inttostr(Aid)+Afilename+inttostr(ASize));
finally
//PachImage; //добавка в listbox5
SqlConnection1.Close;
end;
//Application.ProcessMessages;
end;
но, не сразу все а по строкам, т.е. первая строка записалась, пошла вторая
Ответить с цитированием
  #2  
Старый 12.10.2023, 20:08
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение screen

listbox1a.jpg
на скрине видно что строка разделена точкой с запятой. можно ли передавать их?
пр: label1:=id; label2:=file; label3:=size; тогда станет понятней (мне).
вообще такое возможно? через листбокс
Ответить с цитированием
  #3  
Старый 13.10.2023, 06:55
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,051
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну можено парсить обратно. Но я бы просто создал бы объектики и привязал их к итемам листбокса (через AddObject).
Код:
type
  TFileItemData = class
    FileName : String;
    Atrib : String;
    Size : Integer;
    id : Integer;
    rews:Integer;
    function toString : String;
  end;

function TFileItemData.toString : String
begin
  Format('id: %d; File: %s; Size: %d; Reviews: %d; Attribute: %s',[id,FileName,Size,rews,Atrib]);
end;
тогда заполнение:
Код:
procedure TForm1.AddToMemoCb(AFileName,Atrib:String; ASize,Aid,Arews:Integer);
var
  obj : TFileItemData;
begin
  obj := TFileItemData.Create;
  obj.id = aid;
  obj.FileName := AFileName;
  obj.Size := ASize;
  obj.rews := Arews;
  obj.Atrib := Atrib;
  listbox1.Items.AddObject(obj.toString,obj);
end;
Ну и передача:
Код:
obj := ListBox1.Items.Objects[0]; // Здесь индекс элемента
AddToDbCb(obj.FileName,obj.Atrib, obj.Size, obj.id, obj.rews);
Только чистить объекты не забывай когда удаляешь элементы из листбокса.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
leon2009 (13.10.2023)
  #4  
Старый 14.10.2023, 09:03
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Радость застрял

ругается
Код:
procedure TForm1.Button3Click(Sender: TObject);
var i,j,k:integer; obj : TFileItemData;
begin
  obj.id:=1111;
  obj.FileName := '222222';
  obj.Size := 333333;

obj:=listbox1.Items.Objects[1];

AddToMemoCb2(obj.FileName,obj.Size,obj.id);
end;
Код:
obj:=listbox1.Items.Objects[1];
т.е. когда в integer или string не ругается но и нет значений (или Filename = FORM1)
Ответить с цитированием
  #5  
Старый 14.10.2023, 10:17
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Стрелка картинка

error1a.jpg
скрин на всякий
Ответить с цитированием
  #6  
Старый 14.10.2023, 20:55
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение я про

я про в общем:
Код:
obj:=ListBox1.Items.Objects[ListBox1.ItemIndex] as TFileItemData;
Код:
obj:=ListBox1.Items.Objects[1] as TFileItemData;
в общем ругается на все это или в стринге то FileName=Form1

Последний раз редактировалось leon2009, 14.10.2023 в 20:58.
Ответить с цитированием
  #7  
Старый 16.10.2023, 00:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,051
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да, забыл, приведение типов надо (as TFileItemData).
А вообще-то все работает. Т.е. ты в своем коде что-то делаешь не так:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ListBox1DblClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TFileItemData = class
    FileName : String;
    Atrib : String;
    Size : Integer;
    id : Integer;
    rews:Integer;
    function toString : String;
  end;

function TFileItemData.toString : String;
begin
  Result := Format('id: %d; File: %s; Size: %d; Reviews: %d; Attribute: %s',[id,FileName,Size,rews,Atrib]);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  I : Integer;
  obj : TFileItemData;
begin
  for I := 1 to 5 do
    begin
      obj := TFileItemData.Create;
      obj.FileName := Format('filename-%d',[i]);
      obj.Atrib := 'R';
      obj.Size := Random(1000000);
      obj.id := i;
      obj.rews := i;
      ListBox1.Items.AddObject(obj.toString,obj)
    end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  I : Integer;
  obj : TFileItemData;
begin
  for I := 0 to ListBox1.Items.Count-1 do
    begin
      obj := ListBox1.Items.Objects[i] As TFileItemData;
      obj.Free;
    end;
end;

procedure TForm1.ListBox1DblClick(Sender: TObject);
var
  obj : TFileItemData;
begin
  if ListBox1.ItemIndex > -1 then
    begin
      obj := ListBox1.Items.Objects[ListBox1.ItemIndex] As TFileItemData;
      ShowMessage(obj.toString);
    end;
end;

end.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
leon2009 (16.10.2023)
  #8  
Старый 16.10.2023, 10:55
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Стрелка понял как объяснить

когда все значение заполнены , то все хорошо!
но когда значение вытаскиваются = здесь ругается т.е.
ругается:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var  obj : TFileItemData;
begin
obj := ListBox1.Items.Objects[2] As TFileItemData;
supertest(obj.Value1,obj.Value2, obj.Value3, obj.Value4, obj.Value5);
end;
Работает:
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
supertest('1111','2222',333,444,555);
end;

и весь код:

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

 type
  TInsertImageToDbCallBack = procedure(AFileName,Atrib: String; ASize1, Aid, Arews: Integer) of object;

  private
    { Private declarations }
  public
  procedure FileImg(const dirName:string; ACallBack : TInsertImageToDbCallBack);
  procedure AddToMemoCb(AFileName,Atrib: String; ASize,Aid,Arews: Integer);
  procedure supertest(FileName2,trib2: String; id2,Size2,rews2: Integer);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TFileItemData = class
    Value1 : String;
    Value2 : String;
    Value3 : Integer;
    Value4 : Integer;
    Value5 : Integer;
    function toString : String;
  end;

function TFileItemData.toString : String;
begin
  Result := Format('Value1: %s; Value2: %s; Value3: %d; Value4: %d; Value5: %d',[Value1,Value2,Value3,Value4,Value5]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FileImg('G:\leon\delphis\delphi64\sql2\06\Win32\Debug\db\',AddToMemoCb);
end;

procedure TForm1.supertest(FileName2,trib2:String; id2,Size2,rews2:Integer);
var  obj : TFileItemData;
    begin
      obj := TFileItemData.Create;
      obj.Value1 := FileName2;
      obj.Value2 := trib2;
      obj.Value3 := id2;
      obj.Value4 := Size2;
      obj.Value5 := rews2;
      ListBox2.Items.AddObject(obj.toString,obj);
 // listbox2.Items.Add(Format('id: %d; File: %s; Size: %d',[id2,FileName2,Size2,rews2,trib2]));
end;

procedure TForm1.Button2Click(Sender: TObject);
var  obj : TFileItemData;
begin
//obj := ListBox1.Items.Objects[ListBox1.ItemIndex] As TFileItemData;
obj := ListBox1.Items.Objects[2] As TFileItemData;
supertest(obj.Value1,obj.Value2, obj.Value3, obj.Value4, obj.Value5);
//supertest('1111','2222',333,444,555);
end;

procedure TForm1.FileImg(const dirName:string; ACallBack : TInsertImageToDbCallBack);
var
  searchResult: TSearchRec; x,x1:integer;  st:string;
begin
x:=0; x1:=1; st:='111';
  if FindFirst(dirName+'\*', faAnyFile, searchResult)=0 then begin
    try
      repeat
        if (searchResult.Attr and faDirectory)=0 then begin
          if SameText(ExtractFileExt(searchResult.Name), '.jpg') then begin
          inc(x,1);
            ACallBack(IncludeTrailingBackSlash(dirName)+searchResult.Name,st,searchResult.Size,x,x1);
        end;
        end else if (searchResult.Name<>'.') and (searchResult.Name<>'..') then begin
         FileImg(IncludeTrailingBackSlash(dirName)+searchResult.Name,AddToMemoCb);
         end;
      until FindNext(searchResult)<>0
    finally
      FindClose(searchResult);
    end;
  end;
end;

procedure TForm1.AddToMemoCb(AFileName,Atrib:String; ASize,Aid,Arews:Integer);
begin
listbox1.Items.Add(Format('id: %d; File: %s; Size: %d; Reviews: %d; Attribute: %s',[Aid,AFileName,ASize,Arews,Atrib]));
end;

end.
Ответить с цитированием
  #9  
Старый 16.10.2023, 21:35
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Плохо сократил код

Код:
type
  TFileItemData = class
    AFileName : String;
    ASize : String;
    function toString : String;
  end;

function TFileItemData.toString : String;
begin
  Result := Format('Value1: %s; Value2: %d',[AFileName,ASize]);
end;

procedure TForm1.AddToMemoCb(AFileName:String;ASize:integer);
begin
listbox1.Items.Add(Format('Filename: %s; Size: %d',[AFileName,ASize]));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FileImg('G:\leon\delphis\delphi64\sql2\06\Win32\Debug\db\',AddToMemoCb);
end;

procedure TForm1.FileImg(const dirName:string; ACallBack : TInsertImageToDbCallBack);
var
  searchResult: TSearchRec;
begin
  if FindFirst(dirName+'\*', faAnyFile, searchResult)=0 then begin
    try
      repeat
        if (searchResult.Attr and faDirectory)=0 then begin
          if SameText(ExtractFileExt(searchResult.Name), '.jpg') then
            ACallBack(IncludeTrailingBackSlash(dirName)+searchResult.Name,searchResult.Size);
        end else if (searchResult.Name<>'.') and (searchResult.Name<>'..') then begin
         FileImg(IncludeTrailingBackSlash(dirName)+searchResult.Name,AddToMemoCb);
         end;
      until FindNext(searchResult)<>0
    finally
      FindClose(searchResult);
    end;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  I : Integer;
  obj : TFileItemData;
begin
  for I := 0 to ListBox1.Items.Count-1 do
    begin
      obj := ListBox1.Items.Objects[i] As TFileItemData;
      obj.Free;
    end;
end;

procedure TForm1.ListBox1Click(Sender: TObject);

var
  obj : TFileItemData;
begin
  if ListBox1.ItemIndex > -1 then
    begin
      obj := ListBox1.Items.Objects[ListBox1.ItemIndex] As TFileItemData;
      ShowMessage(obj.toString);
    end;
end;
111.jpg

когда делаешь с LISTBOX2 (уже заполненным ) = проблем нет. НО в listbox1 значение берутся с поиска, и здесь глюк
Ответить с цитированием
  #10  
Старый 16.10.2023, 21:51
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение эксперементы

Код:
procedure TForm1.AddToMemoCb(AFileName:String; ASize:Integer);
var obj : TFileItemData;
begin
listbox1.Items.Add(Format('File: %s; Size: %d',[AFileName,ASize]));

      obj := TFileItemData.Create;
      obj.AFileName := AFileName;
      obj.ASize := ASize;
      ListBox2.Items.AddObject(obj.toString,obj);
end;
если
Код:
obj := ListBox1.Items.Objects[ListBox1.ItemIndex] As TFileItemData;
      ShowMessage(obj.toString);
БУДЕТ ошибка
а
в listbox2 = все хорошо!
Код:
obj := ListBox2.Items.Objects[ListBox2.ItemIndex] As TFileItemData;
      ShowMessage(obj.toString);
Значит - не могу сообразить, почему так
понял:
а) listbox1.Items.Add(Format = это listbox.
b) ListBox2.Items.AddObject( = это obj
верно?!

Последний раз редактировалось leon2009, 16.10.2023 в 21:54.
Ответить с цитированием
  #11  
Старый 16.10.2023, 22:04
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Лампочка остатки

осталось как по этап но в базу передать?
т.е. сначала одну строку отправил за ней следующию :?
если просто через FOR то будет просто тормозить все
Ответить с цитированием
  #12  
Старый 17.10.2023, 18:29
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Смех что на уме

Код:
procedure TForm1.AddToDbCb(AFileName:String; ASize: Integer);
begin
SqlConnection1.Open;
try
  SqlQuery1.SQL.Text := 'INSERT INTO test1 (id, name, reviews, size, attribute) VALUES (:id, :name, :reviews, :size, :attribute)';

  SqlQuery1.ParamByName('id').AsInteger := 1;
  SqlQuery1.ParamByName('name').AsString := AFileName;
  SqlQuery1.ParamByName('reviews').AsInteger := random(5);// Arews;
  SqlQuery1.ParamByName('size').AsInteger := ASize; //inttostr(imgsize);
  SqlQuery1.ParamByName('attribute').AsString := 'gggggg';
  SQLQuery1.ExecSQL;
  Memo1.Lines.Add('Запись_добавлена='+Afilename+inttostr(ASize));
finally
SqlConnection1.Close;
end;    
//Application.ProcessMessages;
end;


procedure TForm1.Button3Click(Sender: TObject);
var
  obj : TFileItemData; i:integer;
begin

  if ListBox2.Count =14 then
    begin
    for i := 0 to  ListBox2.Count-1 do  begin
      obj := ListBox2.Items.Objects[i] As TFileItemData;
      AddToDbCb(obj.AFileName,obj.ASize);
      progressbar1.Position:=i;
    end;
end;
end;
так? = это жесть

Последний раз редактировалось leon2009, 17.10.2023 в 18:31.
Ответить с цитированием
  #13  
Старый 17.10.2023, 23:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,051
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тут надо понимать общую архитектуру приложения.
Например, можно список картинок засовывать в очередь, а отдельный поток будет из очереди их брать и загружать в БД. А юзер тем временем может дальше работать.
Ответить с цитированием
  #14  
Старый 19.10.2023, 05:47
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Радость чажко

я не могу это понять
вернее сначала отправляю пр: первую строку -> когда она отправилась отправляем вторую строку и.т.д. (эт понятно), но что MySql не скажет что принял и записал картинку, что бы начать отправлять вторую картинку
Ответить с цитированием
  #15  
Старый 19.10.2023, 12:25
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение пример

Код:
TMyThread = class(TThread)
    SQLConnection1: TSQLConnection;
    SQLTable1: TSQLTable;
    DataSetProvider1: TDataSetProvider;
    ClientDataSet1: TClientDataSet;
    DataSource1: TDataSource;
    SQLQuery1: TSQLQuery;
    Memo1: TMemo;
	    private
	        { Private declarations }
	    protected
	        procedure Execute; override;
          procedure AddToDbCb(AFileName: String; ASize: Integer);
	    end;
Код:
procedure TMyThread.AddToDbCb(AFileName:String; ASize: Integer);
begin
SqlConnection1.Open;
try

  SqlQuery1.SQL.Text := 'INSERT INTO test1 (id, name, reviews, size, attribute) VALUES (:id, :name, :reviews, :size, :attribute)';

  SqlQuery1.ParamByName('id').AsInteger := 1;
  SqlQuery1.ParamByName('name').AsString := AFileName;
  SqlQuery1.ParamByName('reviews').AsInteger := random(5);// Arews;
  SqlQuery1.ParamByName('size').AsInteger := ASize; //inttostr(imgsize);
  SqlQuery1.ParamByName('attribute').AsString := 'gggggg';
  SQLQuery1.ExecSQL;
  Memo1.Lines.Add('Запись_добавлена='+Afilename+inttostr(ASize));
finally
SqlConnection1.Close;
end;
end;
а тут столкнулся
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  obj : TFileItemData; i:integer;
begin

  if ListBox2.Count =14 then
    begin
    for i := 0 to  ListBox2.Count-1 do  begin
      obj := ListBox2.Items.Objects[i] As TFileItemData;
      TMyThread.AddToDbCb(obj.AFileName,obj.ASize);
      progressbar1.Position:=i;
    end;
end;
end;
Код:
TMyThread.AddToDbCb(obj.AFileName,obj.ASize);
так? а чтобы не ругался на TMyThread.AddToDbCb(obj.AFileName,obj.ASize) сделать отдельные функции?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter