| 
| 
 | Вопрос # 4 863/ вопрос решён / | 
 |  Здравствуйте, Уважаемые Эксперты!нахожусь в некотором тупике.
 есть код:
 но где то в глубине души я понимаю, что это "киськин бред". а как его к нормальному виду привести, ума не приложу. нашёл способ с Case of
 и вроде всё устраивает, кроме того, что через ту функцию выводится только один результат, а у меня их может быть несколько, и все они должны выводиться в SG.
 Приложение:Переключить в обычный режим  if L15>0 then   begin      if Row+1=RowCount then     RowCount:=RowCount+1;     Row:=Row+1;   end;   if L18>0 then begin      if Row+1=RowCount then     RowCount:=RowCount+1;     Row:=Row+1;   end;   if L30>0 then begin      if Row+1=RowCount then     RowCount:=RowCount+1;     Row:=Row+1; ____________________________________________________________ var memory,L18,Cena:integer;Lamp:String;beginif StrToInt(E1.Text)>0 thenbeginmemory:=0;L18:=18;Cena:=10;Lamp:='18w';end;if StrToInt(E2.Text)>0 thenbeginmemory:=0;L18:=2;Cena:=2;Lamp:='111111';end;case memory of0: with SG dobegin      if Row+1=RowCount then     RowCount:=RowCount+1;     Row:=Row+1;  end; 1: with SG do begin      if Row+1=RowCount then     RowCount:=RowCount+1;     Row:=Row+1;  end; end;end;
Примечание #1 (25 декабря 2010, 21:42): решение можно сразу не писать, "пните" в нужную сторону. 
 
|  |   Вопрос задал: Ham_ele_on (статус: Посетитель)Вопрос отправлен: 25 декабря 2010, 21:39
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 26 декабря 2010, 12:36; участников в обсуждении: 3. 
|   | Вадим К (статус: Академик), 25 декабря 2010, 23:21 [#1]:Посмотрите внимательно на такой кусок кода 
 if L18>0 then begin
   Cells[0,SG.Row]:='18w(600мм)'; Cells[1,SG.Row]:=IntToStr(L18)+'шт.';
    Cells[2,SG.Row]:=FloatToStr(ArElektrika[0,1])+'р.';Cells[3,SG.Row]:=FloatToStr(L18*ArElektrika[0,1])+' р.';
    if Row+1=RowCount then
     RowCount:=RowCount+1;
     Row:=Row+1;
   end;он повторяется много раз. А это значит, что его можно вынести в процедуру.Делаем метод класса формы приблизительно такой
 
 procedure TForm1.DoSomth(paramL:integer; strk;string; k:integer;);
begin
if paramL>0 then begin
    Cells[0,SG.Row]:=strk; 
    Cells[1,SG.Row]:=IntToStr(paramL)+'шт.';
    Cells[2,SG.Row]:=FloatToStr(ArElektrika[0,k])+'р.';
    Cells[3,SG.Row]:=FloatToStr(paramL*ArElektrika[0,k])+' р.';
    if Row+1=RowCount then
     RowCount:=RowCount+1;
     Row:=Row+1;
   end;
end;и теперь вот тот срашный код вверху до разделительной линии можно вызывать как:
 DoSomth(L15, '15w(400мм)', 0);
DoSomth(L18, '18w(600мм)', 1);
DoSomth(L30, '30w(900мм)', 2);Конечно, я не знаю, что за массив такой ArElektrika, может нужно будет сделать для него доступ или какие то другие телодвижения, но то, что часть кода станет чище - это точно. 
 А когда часть кода стала проще  - можно увидеть и другие однотипные куски.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Ham_ele_on (статус: Посетитель), 26 декабря 2010, 07:47 [#2]:вариант с процедурой я пробовал, но у меня не компилируется такая вещь, ошибки на несовместимости данных string-integer, не знает, что такое Cells и Row. .
  procedure AddCells(L,Cena:integer; strk:string);
begin
if L>0 then begin
    Cells[0,SG.Row]:=strk;
    Cells[1,SG.Row]:=IntToStr(L)+\'шт.\';
    Cells[2,SG.Row]:=FloatToStr(Cena)+\'р.\';
    Cells[3,SG.Row]:=FloatToStr(L*Cena)+\' р.\';
    if Row+1=RowCount then
     RowCount:=RowCount+1;
     Row:=Row+1;
   end;
end; |  
|   | min@y™ (статус: Доктор наук), 26 декабря 2010, 09:42 [#3]: Цитата (Ham_ele_on): вариант с процедурой я пробовал, но у меня не компилируется такая вещь, ошибки на несовместимости данных string-integer, не знает, что такое Cells и Row. Тебе ж сказали:
 
 Цитата (Вадим К): Делаем метод класса формы Читай внимательнее, что умные люди говорят.
 
 procedure TForm1.AddCells(L,Cena:integer; strk:string);
begin
if L>0 then with SG do begin
    Cells[0,SG.Row]:=strk;
    Cells[1,SG.Row]:=IntToStr(L)+\'шт.\';
    Cells[2,SG.Row]:=FloatToStr(Cena)+\'р.\';
    Cells[3,SG.Row]:=FloatToStr(L*Cena)+\' р.\';
    if Row+1=RowCount then
     RowCount:=RowCount+1;
     Row:=Row+1;
   end;
end;Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Ham_ele_on (статус: Посетитель), 26 декабря 2010, 11:54 [#4]:и вот тут видимо оооочень большой пробел в моих знаниях. как добавить метод? |  
|   | min@y™ (статус: Доктор наук), 26 декабря 2010, 12:00 [#5]: Цитата (Ham_ele_on): как добавить метод?  В определении типа формы после private пишешь:
 
   //...
private
  procedure AddCells(L,Cena:integer; strk:string);
public
  // ...
end; Потом жми Ctrl+Shift+C.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Ham_ele_on (статус: Посетитель), 26 декабря 2010, 12:36 [#6]:Ага, спасибо. разобрался. |  17 января 2011, 09:54: Статус вопроса изменён на решённый (изменил автор вопроса — Ham_ele_on) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |