Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с БД, мелкие тонкости - мне не понятны =( 
:(
    Опции темы
rnycop
Дата 15.2.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.2.2006

Репутация: нет
Всего: нет



Постараюсь кратко изложить мои проблемы...
Код

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-ю неделю... Прочитал практически всеь ваш форум.. Очень он помог мне.. Но на некторорые не стандартные решение нет ответов, поэтуму я и написал...
PM MAIL   Вверх
DimW
Дата 15.2.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



смотри событие OnChange компонента TEdit
PM MAIL ICQ   Вверх
rnycop
Дата 15.2.2006, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.2.2006

Репутация: нет
Всего: нет



Вот исходник по которому пробывал сделать это =) тока тут про покупку

Код

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 собитеем =(( можно какой нибудь пример, пожалуста.. А со вторым не знаеш что мона придуматЬ?

PM MAIL   Вверх
Nchanged
Дата 15.2.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.2.2006

Репутация: нет
Всего: нет



Цитата

Вопрос № 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 +))
PM MAIL   Вверх
rnycop
Дата 15.2.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.2.2006

Репутация: нет
Всего: нет



Nchanged, Спасибо за исчерпывающий ответ - ща буду пробывать =)
PM MAIL   Вверх
Nchanged
Дата 15.2.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.2.2006

Репутация: нет
Всего: нет



rnycop: если ниче не выйдет, копируй код сюда, разберемся
PM MAIL   Вверх
rnycop
Дата 15.2.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.2.2006

Репутация: нет
Всего: нет



Код

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

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

Буду ждать ответов!
PM MAIL   Вверх
Albinos_x
Дата 15.2.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 1
Всего: 108



Цитата(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 не подключён...

Это сообщение отредактировал(а) Albinos_x - 18.2.2006, 15:00


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
rnycop
Дата 15.2.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.2.2006

Репутация: нет
Всего: нет



Albinos_x, спасибо за ответ!!! Кажиться понял как все сделать =) Завтра напшу получилось или нет, а ща спать ушел =)
PM MAIL   Вверх
rnycop
Дата 18.2.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.2.2006

Репутация: нет
Всего: нет



Все замечательно, все работает =)

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

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

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

3. Как в базе данных сделать индексированые поля или поле? (bBase) допустем если были выдены изменение или добавление.
PM MAIL   Вверх
Guedda
Дата 18.2.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: нет
Всего: 78



Цитата(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


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Albinos_x
Дата 18.2.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 1
Всего: 108



Цитата(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)


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Albinos_x
Дата 18.2.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 1
Всего: 108



и ещё было бы не плохо сделать проверку перез ф-ей 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() выдаёт, поэтому лучше перестраховаться...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
rnycop
Дата 25.2.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.2.2006

Репутация: нет
Всего: нет



БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ!!!!! smile smile smile smile

Если что я в вашем распорежении =)) (чем смогу тем помогу)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0952 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.