Два изображения в одной форме

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

ivaser
Сообщения: 5
Зарегистрирован: 22 дек 2005, 01:15

Как сделать в одной форме два разных изображения?
Есть форма с БД в базе 2 поля Foto в которых ссылки на разные фото
однако фотографии показываются одни и те-же в TImage и TImage1
мне сказали надо писать функцию но я пока не умею, мож кто покажет как это сделать на примере.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Вообще хотелось бы увидеть твой способ, вариаций куча
ну к примеру:
Image1.Picture.Assing(TBlobField(Query.FieldByName('Pict'))

Ну и если надо, для очистки пиши так
Image1.Picture := nil;
[syntax=Delphi] [/syntax]
ivaser
Сообщения: 5
Зарегистрирован: 22 дек 2005, 01:15

Взможно с ошибками, так как я тока учусь, весь исходник

unit Unit1;
interface
uses
Windows, Messages, Classes, SysUtils, Graphics, Grids,
Controls, StdCtrls, Forms, Dialogs, DBCtrls, DB, DBTables,
Mask, ExtCtrls, Buttons, Menus, Printers, jpeg;

type
TForm1 = class(TForm)
Table1ID: TStringField;
Table1StringField: TStringField;
Table1StringField2: TStringField;
Table1StringField3: TStringField;
Table1_: TDateField;
Table1StringField4: TStringField;
Table1StringField5: TStringField;
Table1StringField6: TStringField;
Table1StringField7: TStringField;
Table1StringField8: TStringField;
Table1StringField9: TStringField;
Table1F1: TStringField;
Table1F2: TStringField;
Table1BooleanField: TBooleanField;
ScrollBox: TScrollBox;
Label1: TLabel;
EditID: TDBEdit;
Label2: TLabel;
EditDBEdit: TDBEdit;
Label3: TLabel;
EditDBEdit2: TDBEdit;
Label4: TLabel;
EditDBEdit3: TDBEdit;
Label5: TLabel;
Edit_: TDBEdit;
Label6: TLabel;
EditDBEdit4: TDBEdit;
Label7: TLabel;
EditDBEdit5: TDBEdit;
Label8: TLabel;
EditDBEdit6: TDBEdit;
Label9: TLabel;
EditDBEdit7: TDBEdit;
Label10: TLabel;
EditDBEdit8: TDBEdit;
Label11: TLabel;
EditDBEdit9: TDBEdit;
Label12: TLabel;
EditF: TDBEdit;
Label13: TLabel;
EditF2: TDBEdit;
DBNavigator: TDBNavigator;
Panel1: TPanel;
DataSource1: TDataSource;
Panel2: TPanel;
Table1: TTable;
BitBtn1: TBitBtn;
StaticText1: TStaticText;
StaticText2: TStaticText;
Image1: TImage;
Image2: TImage;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
Help1: TMenuItem;
about1: TMenuItem;
Label15: TLabel;
procedure FormCreate(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure DBNavigatorClick(Sender: TObject; Button: TNavigateBtn);
procedure DataSource1DataChange(Sender: TObject; Field: TField);
procedure Table1BeforeOpen(DataSet: TDataSet);
procedure Table1AfterScroll(DataSet: TDataSet);
procedure N2Click(Sender: TObject);
procedure about1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;
BmpPath: string;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Active:= True; // открыть (таблицу) базу данных
end;
// выводит фотографию в поле Image1
procedure ShowFoto(foto: string);
begin
try
Form1.Image1.Picture.LoadFromFile(BmpPath+foto);
Form1.Image2.Picture.LoadFromFile(BmpPath+foto);
Form1.Image1.Visible:=True;
Form1.Image2.Visible:=True;
except
on EFOpenError do
begin
MessageDlg('Файл иллюстрации '+foto+' не найден.',
mtInformation, [mbOk], 0);
end;
end;
end;
procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
if form1.EditF.Visible
and form1.EditF2.Visible
then
begin
form1.EditF.Visible := true;
form1.Label12.Visible:=true;
form1.EditF2.Visible := true;
form1.Label13.Visible:=true;
end;
if Form1.Editf.Text <> ''
then ShowFoto(Form1.EditF.Text)
else form1.Image1.Visible:=False;
end;
// печать формы
procedure TForm1.N2Click(Sender: TObject);
begin
print;
end;
//процедура закрытия программы из меню
procedure TForm1.N3Click(Sender: TObject);
begin
close;
end;

procedure TForm1.DBNavigatorClick(Sender: TObject; Button: TNavigateBtn);
begin
case Button of
nbInsert: begin // добавить запись
Image1.Visible:=true; // скрыть область вывода иллюстрации
image2.Visible:=true;
EditF.Visible:=True; // показать поле Фото
EditF2.Visible:=True;
Label12.Visible:=True; // показать метку Фото
Label13.Visible:=True;
end;
nbEdit: begin // редактирование записи
EditF.Visible:=True; // показать поле Фото
EditF2.Visible:=True;
Label12.Visible:=True; // показать метку Фото
Label13.Visible:=True;
end;
end;
end;
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
// определить каталог, в котором находятся
// иллюстрации
BmpPath:=ExtractFilePath(ParamStr(0))+'data\';
end;

// перед тем, как открыть базу данных (таблицу)
procedure TForm1.Table1BeforeOpen(DataSet: TDataSet);
begin
BmpPath:=ExtractFilePath(ParamStr(0))+'data\';
end;

procedure TForm1.about1Click(Sender: TObject);
begin
MessageDlg('Программа фотоархив.', mtInformation, [mbOk], 0);
end;

end.
ivaser
Сообщения: 5
Зарегистрирован: 22 дек 2005, 01:15

да еще у меня нет blob.
Почемуто Дефи не хочет его распознать, поэтому я дал ссылку на фото из папки дата.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Ну здесь я не вижу как ты вызываешь процедуру для foto

EditF.Visible:=True; // показать поле Фото
У тебя что они невидимые чтоли все иначе в этом смысла нет..

Потом разберем
BmpPath:=ExtractFilePath(ParamStr(0))+'data\';

ParamStr(0) - объясни мне что за путь ты извлекаешь и насколько это верно..
ну далее папка

чтоб загрузить картинки в какой-то момент тебе нужно
ShowFoto('123.jpg'); //типа название файла или переменной опять же смотря как делать
Причем незачем их делать видимыми каждый раз при создании формы они уже такие(Form1.Image1.Visible:=True ;)

Потом эта строчка меня напрягает
Table1.Active:= True; // открыть (таблицу) базу данных
это не открыт а задействовать ее, опять же если ты руками не выставляешь она уже активна..
[syntax=Delphi] [/syntax]
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Да и по поводу самой процедуры
procedure ShowFoto(foto: string);
begin
try
Form1.Image1.Picture.LoadFromFile(BmpPath+foto); //тебе нужно передать 2 параметра в процедуру
Form1.Image2.Picture.LoadFromFile(BmpPath+foto);
....................
тобишь
procedure ShowFoto(foto: string; foto2: string);
begin
try
Form1.Image1.Picture.LoadFromFile(BmpPath+foto); //тебе нужно передать 2 параметра в процедуру
Form1.Image2.Picture.LoadFromFile(BmpPath+foto2);
///////////////////////
ну и вызов тогда
ShowFoto('foto1.gpg', 'foto2.jpg');
[syntax=Delphi] [/syntax]
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Да и саму процедуру закинь в public

procedure ShowFoto(foto: string; foto2: string);
[syntax=Delphi] [/syntax]
ivaser
Сообщения: 5
Зарегистрирован: 22 дек 2005, 01:15

[quote="Duncon"]Ну здесь я не вижу как ты вызываешь процедуру для foto

EditF.Visible:=True]
Прошу прощения но исхоник не полный, я не вставил некоторые процедуры, там должен быть чекбокс с редактированием полей ввода изображения. Если изображение есть, то поля ввода отсутствуют(невидимы) и наоборот
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

ivaser, во-первых при вставке кода в сообщение - используйте тэг [ code ] - это позволит сохранить отступы и позволит прочитать ваш пост другим ;)
по существу: Если у вас в полях прописаны пути к картинкам, то в процедуре ShowFoto надо сделать так

Код: Выделить всё

procedure ShowFoto(PhotoPath: string; AImage: TImage);
...
  AImage.Picture.LoadFromFile(PhotoPath);
...
ну и вызов её делать дважды проверяя каждое из полей

Duncon, ParamStr(0) - это запущенная прога - всё нормально
а так же Table.Active := true; // по сути эквивалент Table1.Open, только не будет открывать уже открытую таблицу
Изображение
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

2 Игорь Акопян, - угу понятно, не знал, я обычно более четкими методами пользуюсь типа Open..
[syntax=Delphi] [/syntax]
Ответить