Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 863

/ вопрос решён /

Здравствуйте, Уважаемые Эксперты!
нахожусь в некотором тупике.
есть код:
но где то в глубине души я понимаю, что это "киськин бред". а как его к нормальному виду привести, ума не приложу. нашёл способ с Case of
и вроде всё устраивает, кроме того, что через ту функцию выводится только один результат, а у меня их может быть несколько, и все они должны выводиться в SG.

Приложение:
  1. if L15>0 then
  2. begin
  3.  
  4.  
  5. if Row+1=RowCount then
  6. RowCount:=RowCount+1;
  7. Row:=Row+1;
  8. end;
  9. if L18>0 then begin
  10.  
  11.  
  12. if Row+1=RowCount then
  13. RowCount:=RowCount+1;
  14. Row:=Row+1;
  15. end;
  16. if L30>0 then begin
  17.  
  18.  
  19. if Row+1=RowCount then
  20. RowCount:=RowCount+1;
  21. Row:=Row+1;
  22.  
  23. ____________________________________________________________
  24.  
  25. var memory,L18,Cena:integer;
  26. Lamp:String;
  27. begin
  28. if StrToInt(E1.Text)>0 then
  29. begin
  30. memory:=0;
  31. L18:=18;
  32. Cena:=10;
  33. Lamp:='18w';
  34. end;
  35. if StrToInt(E2.Text)>0 then
  36. begin
  37. memory:=0;
  38. L18:=2;
  39. Cena:=2;
  40. Lamp:='111111';
  41. end;
  42. case memory of
  43. 0: with SG do
  44. begin
  45.  
  46.  
  47. if Row+1=RowCount then
  48. RowCount:=RowCount+1;
  49. Row:=Row+1;
  50. end;
  51. 1: with SG do
  52. begin
  53.  
  54.  
  55. if Row+1=RowCount then
  56. RowCount:=RowCount+1;
  57. Row:=Row+1;
  58. end;
  59. end;
  60. end;


Примечание #1 (25 декабря 2010, 21:42):
решение можно сразу не писать, "пните" в нужную сторону.

Ham_ele_on Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

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™

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

Ham_ele_on (статус: Посетитель), 26 декабря 2010, 11:54 [#4]:

и вот тут видимо оооочень большой пробел в моих знаниях. как добавить метод?
min@y™

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

Ham_ele_on (статус: Посетитель), 26 декабря 2010, 12:36 [#6]:

Ага, спасибо. разобрался.

17 января 2011, 09:54: Статус вопроса изменён на решённый (изменил автор вопроса — Ham_ele_on)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:26
Выполнено за 0.04 сек.