Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Работа с БД


Автор: rnycop 15.2.2006, 11:36
Постараюсь кратко изложить мои проблемы...
Код

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBTables;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
DataSource1: TDataSource;
Table1: TTable;
ListBox1: TListBox;

procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
table1.filter:='[NZAV]='+edit1.text+'';
table1.filtered:=true;
while not Table1.eof do begin
ListBox1.Items.Add(Table1.FieldByName('TIP').AsString);
Table1.Next
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Active:=true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
TAble1.Active:=False;
end;

end.


Создаю форму с edit1,button1,listbox1 при нажатии button1 идет поиск по базе нужного номера прибора.

Вопрос № 1. Как сделать так что бы при вводе в edit1 выполнялось событие , т.е. все тоже самое как и при нажатие button1

Вопрос № 2. Далле нужно вырать из listbox1 нужный TIP и при двойном щелчке открылась Form2 с полями edit1-edit10 для просмотра всех характеристик приборов.

Очень прошу чем нибудь помочъ. В Делфи новичок, работаю на нем тока 2-ю неделю... Прочитал практически всеь ваш форум.. Очень он помог мне.. Но на некторорые не стандартные решение нет ответов, поэтуму я и написал...

Автор: DimW 15.2.2006, 11:47
смотри событие OnChange компонента TEdit

Автор: rnycop 15.2.2006, 14:04
Вот исходник по которому пробывал сделать это =) тока тут про покупку

Код

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
    case Key of
      '0' .. '9',#8:  ;    // цифры и <Backspace>
      #13:        Summa;   // вычислить стоимость покупки
      else Key := Chr(0);  // символ не отображать
    end;
end;


т.е. при нажатии клавиши enter запускается процедура Summa собствено где я вводил фильтр и поиск, НО ПОЧЕМУ то не работает, выдает ошибку =(

DimW, Я не заню как пользоваться OnChange собитеем =(( можно какой нибудь пример, пожалуста.. А со вторым не знаеш что мона придуматЬ?

Автор: Nchanged 15.2.2006, 14:22
Цитата

Вопрос № 2. Далле нужно вырать из listbox1 нужный TIP и при двойном щелчке открылась Form2 с полями edit1-edit10 для просмотра всех характеристик приборов.

тебя для редактирования нужно, или для просмотра?
В любом случае делается это просто. Может быть я не о том, конечно

Цитата

procedure Tedit_form.FormShow(Sender: TObject);
Var
  Sel_row, text1  : string;
begin

  Sel_row := Form1.StringGrid1.Cells[2,StrToInt(SelRow)];
  text1 := Form1.StringGrid1.Cells[1,StrToInt(SelRow)];


Здесь не лист бокс а стринггрид. В случае с листбоксом тоже самое практически. Указываешь откуда брать данные. А далее, если у тебя есть переменная text1, делаешь что хочешь с ней. Например:

Цитата

label1.caption:=  text1;

Добавлено @ 14:24
Цитата

Вопрос № 1. Как сделать так что бы при вводе в edit1 выполнялось событие , т.е. все тоже самое как и при нажатие button1

Просто копируешь код из буттон1 на Onchange +))

Автор: rnycop 15.2.2006, 14:39
Nchanged, Спасибо за исчерпывающий ответ - ща буду пробывать =)

Автор: Nchanged 15.2.2006, 14:51
rnycop: если ниче не выйдет, копируй код сюда, разберемся

Автор: rnycop 15.2.2006, 16:37
Код

Sel_row := Form1.StringGrid1.Cells[2,StrToInt(SelRow)];
Не очень понятно... Ели ели нашел stringgrid1 =) Cell, SelRow - что это такое ? Если не трудно напиши синтексис smile - это для общего развития. А вообще хотель бы как нибуть через listbox1 сделать это, мне с listbox1 легче работать нежиля с stringgrid1 т.к. не разу не работал с ним. Для того чтоб было понятно о чем хочу спросить, кидаю скрины form1, form2:

Расуждение:

user posted image

в форме1 водим номер 001 он выдает в listbox1 те ТИПЫ которые отфильтровались и нашлись,при нажатии на один из ТИПОВ открывается форма2

user posted image

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

Вообщем вопрос следующий: Как при нажатии на listbox1 (на любой из ТИПов приборов) открывалась form2 с данными выбраного ТИПа прибора...

ЗЫ Над этой задачкой думаю уже практически неделю никак не получается =((

Да кстати постаянно вылезает ошибка:

user posted image

Что она означает?? и Как сней боротся??

Буду ждать ответов!

Автор: Albinos_x 15.2.2006, 20:59
Цитата(rnycop @ 15.2.2006, 16:37 Найти цитируемый пост)
Как при нажатии на listbox1 (на любой из ТИПов приборов) открывалась form2 с данными выбраного ТИПа прибора...

Код

procedure TForm1.ListBox1DblClick(Sender: TObject);
var s:string;
begin
if ListBox1.ItemIndex=-1 then exit;
if Form2<>nil then Exit;    // если эту строчку не писать и убрать строчку Visible:=false;, то пользователь сможет открыть несколько форм
// сохраняем строку по которой дважды щёлкнули
s:=ListBox1.Items[ListBox1.ItemIndex]
Form2:=TForm.Create(Application);
// если там есть Table то активизируем его
// часть этого кода можно выполнить и в OnCreate второй формы
Form2.Table1.TableName:='{путь к твоей БД}';
Form2.Table1.Active:=True;
// устанавливаем фильтр по типу прибора
Form2.Table1.Filter:='TypeDevise='''+s+'''';
Form2.Table1.Filtered:=true;
Visible:=false;
Form2.Show;
end;
....
// для второй формы
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Table1.Filtered:=false;
Table1.Active:=false;
Action:=caFree;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
Form1.Visible:=false;
Form2:=nil;
end;

Цитата(rnycop @ 15.2.2006, 16:37 Найти цитируемый пост)
Что она означает?? и Как сней боротся??

это означает что Table не подключён...

Автор: rnycop 15.2.2006, 22:39
Albinos_x, спасибо за ответ!!! Кажиться понял как все сделать =) Завтра напшу получилось или нет, а ща спать ушел =)

Автор: rnycop 18.2.2006, 12:39
Все замечательно, все работает =)

Появилось еще пару вопросиков =)

1. Сложение дат. Как можно сложить текущюю дату с датой в базе. Например, 18.02.2006 + 24 мес = 18.02.2008, или 18.02.2006 + 3 мес = 18.05.2006 ?? Очень нужно!

2. С какой базой данных лучше работать в среде делфи (Parodox , dBase и т.д.) подскажите пожалуста.

3. Как в базе данных сделать индексированые поля или поле? (bBase) допустем если были выдены изменение или добавление.

Автор: Guedda 18.2.2006, 13:46
Цитата(rnycop @ 15.2.2006, 15:04)
Вот исходник по которому  пробывал сделать это =) тока тут про покупку

Код

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
    case Key of
      '0' .. '9',#8:  ;    // цифры и <Backspace>
      #13:        Summa;   // вычислить стоимость покупки
      else Key := Chr(0);  // символ не отображать
    end;
end;


т.е. при нажатии клавиши enter запускается процедура Summa собствено где я вводил фильтр и поиск, НО ПОЧЕМУ то не работает, выдает ошибку =(

DimW, Я не заню как пользоваться OnChange собитеем =(( можно какой нибудь пример, пожалуста.. А со вторым не знаеш что мона придуматЬ?

Лучше пользоваться такой функцией:
Код

procedure TForm1.Edit1KeyPress(Sender : Tobject; var Key : Char);
begin
  if not (Key in ['0'..'9', #8,#13]) then Key := #0;
  if Key = #13 then Summa;
end;


По второй части вопроса:
Все, что у тебя написано в Button1.OnClick, перенеси в Edit1.OnChange;
Добавлено @ 13:51
Цитата(rnycop @ 18.2.2006, 13:39)
1. Сложение дат. Как можно сложить текущюю дату с датой в базе. Например, 18.02.2006 + 24 мес = 18.02.2008, или 18.02.2006 + 3 мес = 18.05.2006 ?? Очень нужно!

2. С какой базой данных лучше работать в среде делфи (Parodox , dBase и т.д.) подскажите пожалуста.

3. Как в базе данных сделать индексированые поля или поле? (bBase) допустем если были выдены изменение или добавление.

1.
Код

var
  CurDate, CurDate_2 : TDateTime; //Сложившаяся дата
  dd, mm, yyyy : Word;
begin
  ...
  CurDate := BaseData + Now; //Складываем дату из базы данных с сейчашешней датой
  DecodeDate(Now, dd, mm, yyyy);
  mm := mm + 3;
  EncodeDate(CurDate_2, dd, mm, yyyy); //прибавляем к дате 3 месяца
end;
{Писал без проверки, поэтому могут быть ошибки в DecodeDate, EncodeDate}

2. Смотря для чего. Я бы посоветовал Paradox
3. Среди тех баз, которые ты перечислил, индексировать можно только Paradox

Автор: Albinos_x 18.2.2006, 14:54
Цитата(rnycop @ 18.2.2006, 12:39 Найти цитируемый пост)
1. Сложение дат. Как можно сложить текущюю дату с датой в базе. Например, 18.02.2006 + 24 мес = 18.02.2008, или 18.02.2006 + 3 мес = 18.05.2006 ?? Очень нужно!

Код
...
var    
  CurDate : TDateTime;
...
// прибавить сутки к текущей дате
CurDate:=Date+1; 

Цитата(Guedda @ 18.2.2006, 13:46 Найти цитируемый пост)

DecodeDate(Now, dd, mm, yyyy);
  mm := mm + 3;
EncodeDate(CurDate_2, dd, mm, yyyy); //прибавляем к дате 3 месяца

здесь ошибка,
надо так:
Код

CurDate_2:=EncodeDate(dd,mm,yyyy)

первая переменная год(dd), вторая - месяц(mm), третья - день (yyyy)

Автор: Albinos_x 18.2.2006, 15:09
и ещё было бы не плохо сделать проверку перез ф-ей EncodeDate.... вот так:
Код

DecodeDate(Now, dd, mm, yyyy); 
mm := mm + 3;
if mm>12 then
   begin
   dd:=dd+(mm div 12);
   mm:=mm mod 12;
   end;
CurDate_2:=EncodeDate(dd,mm,yyyy);

просто ф-я EncodeDate может выдать ошибку при превышении mm - 12 и т.п., точно не знаю, не проверял, но ф-я EncodeTime() выдаёт, поэтому лучше перестраховаться...

Автор: rnycop 25.2.2006, 16:14
БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ!!!!! smile smile smile smile

Если что я в вашем распорежении =)) (чем смогу тем помогу)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)