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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.09.2011, 09:12
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
По умолчанию Оптимизация кода, работа с ADO

Ребята, прошу сразу не ругаться, опыта в программировании очень мало, помогите, пожалуйста, оптимизировать код (работает исправно, но очень кривой)!

Код:
unit Unit3;

interface

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

type
  TParam = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label5: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label6: TLabel;
    ComboBox1: TComboBox;
    Label7: TLabel;
    ComboBox2: TComboBox;
    ComboBox3: TComboBox;
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
//    procedure SIE (a: Tobject; b:boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Param: TParam;
  strmain: String;
implementation

uses Unit1, Unit2, ADODB, TypInfo;


{$R *.dfm}

procedure Chisto;   // ïðîöåäóðêà íóæíà, ÷òîáû î÷èñòèòü ñîäåðæèìîå êîìáîáîêñîâ è åäèòîâ ïî îêîí÷àíèè ðàáîòû
var i: Integer;
begin
 for i:=0 to Param.ComponentCount-1 do begin
  if Param.Components[i] is TEdit then
   (Param.Components[i] as TEdit).Clear;
  if Param.Components[i] is TComboBox then
   (Param.Components[i] as TComboBox).ItemIndex:=-1;
 end;
end;

procedure TParam.BitBtn2Click(Sender: TObject); //î÷èùàåì êîìáîáîêñû è åäèòû ïî êíîïêå 'Âûõîä'
begin
 Chisto;
 Param.Close;
end;

procedure TParam.FormClose(Sender: TObject; var Action: TCloseAction);  //òî æå ñàìîå, íî ïðè çàêðûòèè ôîðìû;
begin
 Chisto;
end;

procedure F1E(str1, str2, str3: String; k: Integer);  // çäåñü áóäóò ïåðåäàâàòüñÿ ïàðàìåòðû â àäî-êâåðè èç ýäèòîâ
begin
// FmMain.ADOQuery1.Parameters.AddParameter.Name:=str1;
// FmMain.ADOQuery1.Parameters.ParamByName(str1).Value:=str2; //str2 - ñîäåðæèìîå åäèòà
 if k=1 then strmain:=strmain+'((('+str3+')=:'+str1+'))'
 else strmain:=strmain + ' and ((('+str3+')=:'+str1+'))';
end;

procedure TParam.BitBtn1Click(Sender: TObject);
var j, k: Integer; stre, stre1, stre2:String;
begin
  strmain:='Select * from Kontrol_noska where '; // çàäàåì ñàìóþ ãëàâíóþ ñòðîêó
  k:=0;
  for j:=0 to Param.ComponentCount-1 do  begin
   if Param.Components[j] is TEdit then
     if (Param.Components[j] as TEdit).Text<>'' then begin
       inc(k);
       if Param.Components[j].Name='Edit1' then begin
        stre:='Nosit';
        stre2:='Nositel';                // åñëè ââåëè â ýäèò1 Èìÿ Íîñèòåëÿ - ïðèñâàèâàåì íåîáõîäèìûå ïàðàìåòðû
        stre1:=Edit1.Text;
        F1E(stre, stre1, stre2, k);
       end;
       if Param.Components[j].Name='Edit2' then begin
        stre:='Mo';
        stre2:='Model';
        stre1:=Edit2.Text;            // åñëè ââåëè â ýäèò2 Íàçâàíèå Ìîäåëè - ðàáîòàåì ñ íåé
        F1E(stre, stre1, stre2, k);
       end;
     end;
   if Components[j] is TComboBox then
     if (Components[j] as TComboBox).Text<>'' then begin
       inc(k);
       if Param.Components[j].Name='ComboBox3' then begin
        stre:='Ka';
        stre2:='Kabluk';                  //åñëè ââåëè â êîìáîáîêñ 3 êàáëóê èëè âûáðàëè èç ñïèñêà....
        stre1:=ComboBox3.Text;
        F1E(stre, stre1, stre2, k);
       end;
       if Param.Components[j].Name='ComboBox2' then begin
        stre:='fason';
        stre2:='fason_kolodki';
        stre1:=ComboBox3.Text;
        F1E(stre, stre1, stre2, k);
       end;
       if Param.Components[j].Name='ComboBox1' then begin
        stre:='Grup';
        stre2:='Gruppa';
        stre1:=ComboBox1.Text;
        F1E(stre, stre1, stre2, k);
       end;
     end;
  end;
  if k=0 then ShowMessage('Íå çàäàíû ïàðàìåòðû äëÿ ïîèñêà')
  else begin
      with fmMain.ADOQuery1 do begin
      Active:=False;                        // ýòîò êóñîê êîäà íóæåí äëÿ òîãî, ÷òîáû òàáëèöà êàæäûé ðàç îáíîâëÿëàñü, åñëè áûë ïðèìåíåí ôèëüòð
      SQL.Clear;
      Parameters.AddParameter.Name:='Nosit';
      Parameters.ParamByName('Nosit').Value:=Edit1.Text;
      Parameters.AddParameter.Name:='Mo';
      Parameters.ParamByName('Mo').Value:=Edit2.Text;
      Parameters.AddParameter.Name:='Ka';
      Parameters.ParamByName('Ka').Value:=ComboBox3.Text;
      Parameters.AddParameter.Name:='Grup';
      Parameters.ParamByName('Grup').Value:=ComboBox1.Text;
      Parameters.AddParameter.Name:='fason';
      Parameters.ParamByName('fason').Value:=ComboBox2.Text;
      SQL.Add(strmain);
       fmChild1.DBGrid1.DataSource:=FmMain.DataSource1;
       Active:=True;
       fmChild1.Label1.Caption:='Íàéäåíî çàïèñåé: ' + IntToStr(fmMain.ADOQuery1.RecordCount);
       if fmMain.ADOQuery1.RecordCount=0 then ShowMessage('Ïî âàøåìó çàïðîñó íè÷åãî íå íàéäåíî');
       Param.Close;
       fmChild1.ShowModal;
      end;
  end;

end;
end. 
Ответить с цитированием
  #2  
Старый 02.09.2011, 10:34
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Существует такое негласное правило: Если программа работает хорошо, дальнейшее улучшение с целью оптимизации кода неизбежно приведет к ухудшению или полной неработоспособности программы.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 02.09.2011, 15:16
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
По умолчанию

Тогда объясни, пожалуйста, почему если в процедуре

Код:
procedure F1E(str1, str2, str3: String; k: Integer); 
begin
// FmMain.ADOQuery1.Parameters.AddParameter.Name:=str1;
// FmMain.ADOQuery1.Parameters.ParamByName(str1).Value:=str2;   if k=1 then strmain:=strmain+'((('+str3+')=:'+str1+'))'
 else strmain:=strmain + ' and ((('+str3+')=:'+str1+'))';
end;

я раскомментирую строчки, но закомментирую

Код:
      Parameters.AddParameter.Name:='Nosit';
      Parameters.ParamByName('Nosit').Value:=Edit1.Text; 

то результат будет - пустое множество?...

я не совсем понимаю, как осуществляется передача параметров в ADO, было бы побольше времени - разобралась, но сдавать надо очень скоро
поясни, пожалуйста?
__________________
Memento Mori(арти)
Ответить с цитированием
  #4  
Старый 02.09.2011, 16:14
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Трудно что-то предполагать по кусочкам кода. Я вам рекомендую отладчиком пошагово пройтись по коду и посмотреть, что и куда у вас записывается.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 02.09.2011, 23:19
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
Печаль

я отладчиком не очень хорошо умею пользоваться , могу отследить значение какой-то переменной...

когда добавляю в ADDWatch ParamByName(str1), либо FmMain.ADOQuery1.Parameters.ParamByName(str1), либо с добавлением .Value, пишет "неизвестный параметр", не подскажете, как решить проблемку?...

ADOQuery1 валяется на другой форме.
__________________
Memento Mori(арти)
Ответить с цитированием
  #6  
Старый 03.09.2011, 05:02
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Shoni
когда добавляю в ADDWatch ParamByName(str1), либо FmMain.ADOQuery1.Parameters.ParamByName(str1), либо с добавлением .Value, пишет "неизвестный параметр", не подскажете, как решить проблемку?...

Если правильно помню, то параметры в ADO-компонентах автоматически не создаются, но их можно создать в design-time (если запрос не динамический). А если запрос динамический, то нет смысла делать параметры, проще просто сформировать запрос сразу со значениями.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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