![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Ребята, прошу сразу не ругаться, опыта в программировании очень мало, помогите, пожалуйста, оптимизировать код (работает исправно, но очень кривой)!
![]() Код:
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
|
||||
|
||||
|
Существует такое негласное правило: Если программа работает хорошо, дальнейшее улучшение с целью оптимизации кода неизбежно приведет к ухудшению или полной неработоспособности программы.
![]() |
|
#3
|
||||
|
||||
|
Тогда объясни, пожалуйста, почему если в процедуре
Код:
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, было бы побольше времени - разобралась, но сдавать надо очень скоро ![]() поясни, пожалуйста? |
|
#4
|
||||
|
||||
|
Трудно что-то предполагать по кусочкам кода. Я вам рекомендую отладчиком пошагово пройтись по коду и посмотреть, что и куда у вас записывается.
|
|
#5
|
||||
|
||||
|
я отладчиком не очень хорошо умею пользоваться , могу отследить значение какой-то переменной...
когда добавляю в ADDWatch ParamByName(str1), либо FmMain.ADOQuery1.Parameters.ParamByName(str1), либо с добавлением .Value, пишет "неизвестный параметр", не подскажете, как решить проблемку?... ADOQuery1 валяется на другой форме. |
|
#6
|
|||
|
|||
|
Цитата:
Если правильно помню, то параметры в ADO-компонентах автоматически не создаются, но их можно создать в design-time (если запрос не динамический). А если запрос динамический, то нет смысла делать параметры, проще просто сформировать запрос сразу со значениями. |