Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Incompatible types / 25 сообщений из 35, страница 1 из 2
28.02.2019, 13:10
    #39780329
elimpion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
Код который находит в ////////////1////////////
пытаюсь поместить в ///////////////2///////////
возникает ошибка Incompatible types Почему?
Если код оставить там где он сейчас ошибок не возникает
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
procedure TfrmBRSContractKindRef.ToolbarButton9710Click(Sender: TObject);
var proc:TOraStoredProc;
    res :integer;
    aErrorMsg : string;
    aCode: integer;
    TransMgr : TTransMgr;
    Delete : Integer;
begin
  aErrorMsg:='';

  Delete := MessageBox (
             Self.Handle
             , PChar(aErrorMsg+' Âû õîòèòå óäàëèòü?')
             , PChar('Îøèáêà óäàëåíèÿ')
             , MB_YESNO + MB_ICONINFORMATION + MB_APPLMODAL);
//////////////////////1////////////////////
      if Delete = IDYES then
      begin
        ShowMessage('Äà. ');
      end
      else
      begin
        ShowMessage('Íåò. ');
      end;
//////////////////////1////////////////////

  Proc := CreateOraStoredProc(AnsiUpperCase('pkgeditproduct.deleteproduct'));
  with Proc do begin
    TransMgr := FQI.GetTransMgr;
    TransMgr[FQI.DataBase].StartTransaction;
    try
      Prepare;
      if (FqueBRSContractKindRefInfo.FieldbyName('ContractType').asInteger in [60, 61]) then
      begin
        aCode := FqueBRSContractKindRefInfo.FieldbyName('ContractKind_c').asInteger;
        ParamByName('aContractKind').asInteger := FqueBRSContractKindRefInfo.FieldbyName('ContractKind_c').asInteger;
      end else
      begin
        aCode := FqueBRSContractKindRefInfo.FieldbyName('ContractKind').asInteger;
        ParamByName('aContractKind').asInteger := FqueBRSContractKindRefInfo.FieldbyName('ContractKind').asInteger;
      end;
      ExecProc;
      try
        if Params.FindParam('Result')<>nil then
          res := ParamByName('Result').asInteger;
        if Params.FindParam('aErrorMsg')<>nil then
          aErrorMsg:=ParamByName('aErrorMsg').asString;
      except
        TransMgr[FQI.DataBase].RollBack;
        res := -1;
      end;
    finally
      free;
    end;
    if res<>0 then begin
//////////////////////2////////////////////
      TransMgr[FQI.DataBase].RollBack;
      ShowMessage('&#206;&#248;&#232;&#225;&#234;&#224; &#243;&#228;&#224;&#235;&#229;&#237;&#232;&#255;. '+aErrorMsg);
    end
    else begin
      TransMgr[FQI.DataBase].Commit;
      if assigned(FquePrcCalcInfo) then
      with FquePrcCalcInfo do begin
        try
          DisableControls;
          Close;
          Open;
        finally
          EnableControls;
        end;
      end;
      with FqueBRSContractKindRefInfo do begin
        try
          DisableControls;
          Prior;
          aCode := FieldByName('ContractKind').asInteger;
          Close;
          Open;
          Locate('ContractKind',aCode,[]);
        finally
          EnableControls;
        end;
      end;
    end;
  end;
end;

...
Рейтинг: 0 / 0
28.02.2019, 14:04
    #39780385
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
Непонятно куда ты чего вставляешь, но обрати внимание на один момент - ты это делаешь в блоке WITH (мать его ), а в блоке ты можешь цеплять совсем не те переменные, которые задумал.
...
Рейтинг: 0 / 0
28.02.2019, 14:08
    #39780387
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
elimpion,

Потому что в ////2//// ты пытаешься вызвать Proc.Delete(), а это вообще процедура.
...
Рейтинг: 0 / 0
28.02.2019, 14:21
    #39780398
Любезный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
Учись выбирать адекватные имена для переменных и методов.
...
Рейтинг: 0 / 0
28.02.2019, 14:26
    #39780401
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
with такого размера - это убиться веником.

я отрицательно отношусь к движению запретить with вообще, но with больше 5-6 строк размером - это поиск сюрпризов.

и ОЧЕНЬ хорошо, когда ты их находишь уже при компиляции.

могло быть ГОРАЗДО хуже, когда видимых ошибок бы никаких не было, просто вместо одной функции вызывалась бы другая. Впрочем, может быть и это тоже есть.
...
Рейтинг: 0 / 0
28.02.2019, 14:40
    #39780419
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
Ariochwith такого размера - это убиться веником.

я отрицательно отношусь к движению запретить with вообще, но with больше 5-6 строк размером - это поиск сюрпризов.

и ОЧЕНЬ хорошо, когда ты их находишь уже при компиляции.

могло быть ГОРАЗДО хуже, когда видимых ошибок бы никаких не было, просто вместо одной функции вызывалась бы другая. Впрочем, может быть и это тоже есть.

Просто нужно уметь их использовать... Когда у тебя приведение к типу обращение слишком длинное, а операций нужно сделать много.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  with TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice) do
  begin
    btnA.Visible := True;
    btnA.OnClick := actA;

    btnB.Visible := True;
    btnB.OnClick := actB;

    btnC.Visible := True;
    btnC.OnClick := actC;

    btnD.Visible := True;
    btnD.OnClick := actD;
  end



VS

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnA.Visible := True;
    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnA.OnClick := actA;

    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnB.Visible := True;
    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnB.OnClick := actB;

    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnC.Visible := True;
    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnC.OnClick := actC;

    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnD.Visible := True;
    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnD.OnClick := actD;



Пример примитивный, но зато понятный.
...
Рейтинг: 0 / 0
28.02.2019, 14:45
    #39780423
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
elimpionКод который находит в ////////////1////////////
пытаюсь поместить в ///////////////2///////////
возникает ошибка Incompatible types Почему?
Если код оставить там где он сейчас ошибок не возникает
Код: pascal
1.
2.
3.
4.
procedure TfrmBRSContractKindRef.ToolbarButton9710Click(Sender: TObject);
var proc:TOraStoredProc;
    res :integer;
    Сократил;



У тебя с момента где начинается с
Код: pascal
1.
2.
  with Proc do begin
    TransMgr := FQI.GetTransMgr;


имеется сокращение и "Proc" имеет метод Delete

когда ты пишешь

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var
  delete: integer;
begin
  delete := 0;
  with Proc do
  begin
    delete; // вызовется Proc.Delete;
  end
end
...
Рейтинг: 0 / 0
28.02.2019, 15:04
    #39780438
elimpion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
RackotPro,
вот если просто delete отправить
Код: pascal
1.
2.
3.
4.
  with Proc do
  begin
    delete; // вызовется Proc.Delete;
  end


тогда нормально отработает, без ошибок. Если начну в Delete еще условия писать, тогда начинают ошибки
...
Рейтинг: 0 / 0
28.02.2019, 15:11
    #39780440
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
RackotProПросто нужно уметь их использовать... Когда у тебя приведение к типу обращение слишком длинное, а операций нужно сделать много.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  with TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice) do
  begin
    btnA.Visible := True;
    btnA.OnClick := actA;

    btnB.Visible := True;
    btnB.OnClick := actB;

    btnC.Visible := True;
    btnC.OnClick := actC;

    btnD.Visible := True;
    btnD.OnClick := actD;
  end


Пример примитивный, но зато понятный.
Да-а, пример говорит кое о чём. Например о том, что у тебя дофига связности в проекте.
Сразу видно что этот код не должен быть в этом месте.
...
Рейтинг: 0 / 0
28.02.2019, 15:28
    #39780455
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
elimpionRackotPro,
вот если просто delete отправить
Код: pascal
1.
2.
3.
4.
  with Proc do
  begin
    delete; // вызовется Proc.Delete;
  end


тогда нормально отработает, без ошибок. Если начну в Delete еще условия писать, тогда начинают ошибки


Proc.Delete это функция твоего Proc := CreateOraStoredProc(AnsiUpperCase('pkgeditproduct.deleteproduct'));

Это не твоя переменная Delete.

В общем решение твоей проблемы, в том, что нужно переименовать твою переменную из Delete в Del к примеру.

Вот тебе полный код, который ты хочешь, попробуй понять свою ошибку. Но я бы на твоём месте начал бы с открытия книги "Библия делфи".

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
procedure TfrmBRSContractKindRef.ToolbarButton9710Click(Sender: TObject);
var proc:TOraStoredProc;
    res :integer;
    aErrorMsg : string;
    aCode: integer;
    TransMgr : TTransMgr;
    Del : Integer;
begin
  aErrorMsg:='';
  Del := MessageBox (
         Self.Handle
         , PChar(aErrorMsg+' &#194;&#251; &#245;&#238;&#242;&#232;&#242;&#229; &#243;&#228;&#224;&#235;&#232;&#242;&#252;?')
         , PChar('&#206;&#248;&#232;&#225;&#234;&#224; &#243;&#228;&#224;&#235;&#229;&#237;&#232;&#255;')
         , MB_YESNO + MB_ICONINFORMATION + MB_APPLMODAL);


  Proc := CreateOraStoredProc(AnsiUpperCase('pkgeditproduct.deleteproduct'));
  with Proc do begin
    TransMgr := FQI.GetTransMgr;
    TransMgr[FQI.DataBase].StartTransaction;
    try
      Prepare;
      if (FqueBRSContractKindRefInfo.FieldbyName('ContractType').asInteger in [60, 61]) then
      begin
        aCode := FqueBRSContractKindRefInfo.FieldbyName('ContractKind_c').asInteger;
        ParamByName('aContractKind').asInteger := FqueBRSContractKindRefInfo.FieldbyName('ContractKind_c').asInteger;
      end else
      begin
        aCode := FqueBRSContractKindRefInfo.FieldbyName('ContractKind').asInteger;
        ParamByName('aContractKind').asInteger := FqueBRSContractKindRefInfo.FieldbyName('ContractKind').asInteger;
      end;
      ExecProc;
      try
        if Params.FindParam('Result')<>nil then
          res := ParamByName('Result').asInteger;
        if Params.FindParam('aErrorMsg')<>nil then
          aErrorMsg:=ParamByName('aErrorMsg').asString;
      except
        TransMgr[FQI.DataBase].RollBack;
        res := -1;
      end;
    finally
      free;
    end;
    if res<>0 then begin

//////////////////////1////////////////////
      if Del = IDYES then
      begin
        ShowMessage('&#196;&#224;. ');
      end
      else
      begin
        ShowMessage('&#205;&#229;&#242;. ');
      end;
//////////////////////1////////////////////
      TransMgr[FQI.DataBase].RollBack;
      ShowMessage('&#206;&#248;&#232;&#225;&#234;&#224; &#243;&#228;&#224;&#235;&#229;&#237;&#232;&#255;. '+aErrorMsg);
    end
    else begin
      TransMgr[FQI.DataBase].Commit;
      if assigned(FquePrcCalcInfo) then
      with FquePrcCalcInfo do begin
        try
          DisableControls;
          Close;
          Open;
        finally
          EnableControls;
        end;
      end;
      with FqueBRSContractKindRefInfo do begin
        try
          DisableControls;
          Prior;
          aCode := FieldByName('ContractKind').asInteger;
          Close;
          Open;
          Locate('ContractKind',aCode,[]);
        finally
          EnableControls;
        end;
      end;
    end;
  end;
end;

...
Рейтинг: 0 / 0
28.02.2019, 15:35
    #39780463
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
DimonkaRackotProПросто нужно уметь их использовать... Когда у тебя приведение к типу обращение слишком длинное, а операций нужно сделать много.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  with TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice) do
  begin
    btnA.Visible := True;
    btnA.OnClick := actA;

    btnB.Visible := True;
    btnB.OnClick := actB;

    btnC.Visible := True;
    btnC.OnClick := actC;

    btnD.Visible := True;
    btnD.OnClick := actD;
  end


Пример примитивный, но зато понятный.
Да-а, пример говорит кое о чём. Например о том, что у тебя дофига связности в проекте.
Сразу видно что этот код не должен быть в этом месте.

Ты прав, но иногда такое нужно, это был псевдо код.
Хорошо, допустим вот

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
     
      TfmDocumentEditor(FDocumentEditor).IsAppend := True;
      TfmDocumentEditor(FDocumentEditor).gbAttributes.Visible := False;
      TfmDocumentEditor(FDocumentEditor).cxSplitterAttrib.Visible := TfmDocumentEditor(FDocumentEditor).gbAttributes.Visible;
      TfmDocumentEditor(FDocumentEditor).gbDocNote.Visible := False;
      TfmDocumentEditor(FDocumentEditor).cxspltrDocNote.Visible := TfmDocumentEditor(FDocumentEditor).gbDocNote.Visible;
      TfmDocumentEditor(FDocumentEditor).Enabled := True;
      TfmDocumentEditor(FDocumentEditor).EditorMode := oemInsert;



Симпотичнее, да и читабельнее будет:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  with TfmDocumentEditor(FDocumentEditor) do
  begin
      IsAppend := True;
      gbAttributes.Visible := False;
      cxSplitterAttrib.Visible := gbAttributes.Visible;
      gbDocNote.Visible := False;
      cxspltrDocNote.Visible := gbDocNote.Visible;
      Enabled := True;
      EditorMode := oemInsert;
  end;



Да with удобно использовать когда работаешь с интерфейсами ну или тебе просто что-то записать нужно в тот же TMemoryStream, просто нужно изолировать из with работу с другими переменными или фукнциями(желательно). А в данном посте просто пример плохого объявления переменных. Ну плохим тоном считается использовать переменные с именем Delete Insert Add и прочими совпадениями с разными методами.

Короче with придумали не дибилы)) он правда удобен, а мне к примеру, просто необходим. Если не нравится да можно не использовать, но в целом очень удобная вещь.
...
Рейтинг: 0 / 0
28.02.2019, 15:41
    #39780470
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
RackotProПросто нужно уметь их использовать... Когда у тебя приведение к типу обращение слишком длинное, а операций нужно сделать много.

............

VS

............
VS
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
var
  Doc: TDocumentPrice;
begin
  Doc := TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice);

  Doc.btnA.Visible := True;
  Doc.btnA.OnClick := actA;

  Doc.btnB.Visible := True;
  Doc.btnB.OnClick := actB;

  Doc.btnC.Visible := True;
  Doc.btnC.OnClick := actC;

  Doc.btnD.Visible := True;
  Doc.btnD.OnClick := actD;
end


RackotProПример примитивный, но зато понятный.как делать не надо
...
Рейтинг: 0 / 0
28.02.2019, 15:50
    #39780478
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
RackotProПросто нужно уметь их использовать... Когда у тебя приведение к типу обращение слишком длинное, а операций нужно сделать много.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  with TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice) do
  begin
    btnA.Visible := True;
    btnA.OnClick := actA;

    btnB.Visible := True;
    btnB.OnClick := actB;

    btnC.Visible := True;
    btnC.OnClick := actC;

    btnD.Visible := True;
    btnD.OnClick := actD;
  end




VS

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnA.Visible := True;
    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnA.OnClick := actA;

    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnB.Visible := True;
    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnB.OnClick := actB;

    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnC.Visible := True;
    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnC.OnClick := actC;

    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnD.Visible := True;
    TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice).btnD.OnClick := actD;




Пример примитивный, но зато понятный.

Пример неполный. Ложная дихотомия.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  

  P := TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice); 

  P.btnA.Visible := True;
  P.btnA.OnClick := actA;

  P.btnB.Visible := True;
  P.btnB.OnClick := actB;

  P.btnC.Visible := True;
  P.btnC.OnClick := actC;

  P.btnD.Visible := True;
  P.btnD.OnClick := actD;
...
Рейтинг: 0 / 0
28.02.2019, 16:37
    #39780498
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
RackotProпросто нужно изолировать из with работу с другими переменными или фукнциями

А как это сделать, чтобы Delphi просто не позволил программисту использовать "другую переменную", кроме короткого списка разрешённых?


RackotProплохим тоном считается использовать переменные с именем Delete Insert Add

нет

и прочими совпадениями с разными методами.

никакого совпадения в //////1//// нету

а в ///////2////// - уже ошибка компиляции и разговор о плохом-хорошем тоне теряет смысл


Кстати, лично я отхватил много веселья перетаскивая программу (и разные библиотеки, даже DevExpress 4 пытался) c Delphi 2006 на XE2.

куски кода типа

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Var r: TRect;

....
  r := .....;
...
  with r do begin
.....
.....
.....
     NormalizeRect(....);  // бдыщщ!!!!
.....
end;



Ну не было во времена Delphi 3-7-2006 такого метода как TRect.NormalizeRect не-бы-ло.
И потому никаких "прочими совпадениями" тоже не было.
Много лет не было.
А потом появилось.


RackotProКороче with придумали не дибилы))

with придумали для обучения программирования в школе, на примере маленьких программок, на языке без классов-методов (и не помню были ли там указатели на процедуры-функции изначально)
...
Рейтинг: 0 / 0
28.02.2019, 16:56
    #39780509
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
RackotProКороче with придумали не дибилы

я вот тоже удивляюсь, откуда тут взялось множественное число, если имя человека, который придумал with, общеизвестно
...
Рейтинг: 0 / 0
28.02.2019, 17:02
    #39780514
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
AriochПример неполный. Ложная дихотомия.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  P := TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice); 

  P.btnA.Visible := True;
  P.btnA.OnClick := actA;

  P.btnB.Visible := True;
  P.btnB.OnClick := actB;

  P.btnC.Visible := True;
  P.btnC.OnClick := actC;

  P.btnD.Visible := True;
  P.btnD.OnClick := actD;



Да но я хотел показать простой пример с длинными названиями, когда у вас

Код: pascal
1.
2.
3.
4.
5.
  with ОченьБольшоеДлинноеШирокоеНазваниеФормыДляЮристовКотиковИНаркоманов do
  begin
     button.Visible := False;
     label.width := 100500;
  end;



Да и пример с var ваш имеет место быть, да и правильнее. Но я, на пример, намеренно говнокодю когда:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
//Милион милион алых строк кода
//а вот тут нужно в данный момент отключить контрол на 6-ой форме именно тут 
//и обращение через луну(как правило это заплатка за 5 минут)

  with TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice) do
  begin
    btnA.Visible := True;
    btnA.OnClick := actA;
  end;


И позже когда сюда вернёшься, не очень удобно будет листать "милион милион алых строк", что бы убрать или заменить тот самый var.

Так что мой вердикт такой, используйте всё что хотите, главное, что бы это было читабельно и понятно всем.
...
Рейтинг: 0 / 0
28.02.2019, 17:04
    #39780518
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
AriochRackotProКороче with придумали не дибилы

я вот тоже удивляюсь, откуда тут взялось множественное число, если имя человека, который придумал with, общеизвестно

Наверное, до такой степени я не гуглил)) Ну давай сын маминой подруги расскажи имя, ты же знаешь его. А число ПИ до 20-той запятой тоже без гугла напишешь?))
Мамкины хейтеры какие-то))

Ну такое, в общем, вкусовщина.
...
Рейтинг: 0 / 0
28.02.2019, 17:14
    #39780526
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
Ariochна языке без классов-методов (и не помню были ли там указатели на процедуры-функции изначально)

"процедурных переменных" в 1974 не было

были "процедурные параметры" в процедурах, но не в record'ах и потому на with не влияли
...
Рейтинг: 0 / 0
28.02.2019, 17:17
    #39780528
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
RackotProНаверное, до такой степени я не гуглил

если тебе надо гуглить то, что все без гугла знают, то может быть тебе рановато рассуждать, кто был дебил, а кто нет?

если кто-то хочет рассуждать о внешней политике России, то он должен знать фамилию Путин. БЕЗ ГУГЛА.
если кто-то хочет рассуждать об истории СССР, то он должен знать фамилию Ленин. БЕЗ ГУГЛА.
если кто-то хочет рассуждать о силе притяжение, то он должен знать фамилию Ньютон. БЕЗ ГУГЛА.

а если простую логику ты считаешь хейтерством - то дело твоё
...
Рейтинг: 0 / 0
28.02.2019, 17:20
    #39780532
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
RackotProДа и пример с var ваш имеет место быть, да и правильнее. Но я, на пример, намеренно говнокодю когда:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
//Милион милион алых строк кода
//а вот тут нужно в данный момент отключить контрол на 6-ой форме именно тут 
//и обращение через луну(как правило это заплатка за 5 минут)

  with TDocumentPrice(TDocument(TFlow(Flow).Document).DocumentPrice) do
  begin
    btnA.Visible := True;
    btnA.OnClick := actA;
  end;


И позже когда сюда вернёшься, не очень удобно будет листать "милион милион алых строк", что бы убрать или заменить тот самый var.

Так что мой вердикт такой, используйте всё что хотите, главное, что бы это было читабельно и понятно всем.
У тебя в строке WITH 3 опасных приведения типа. ТРИ, Карл! Любое из них может оказаться ошибочным и привет. Любое из них может стать ошибочным при даже небольшом рефакторинге и ты этого не заметишь при компиляции.
Плюс искусственная связность. Зачем обращаться к подкомпонентам таким образом? Для этого придуманы стандартные механизмы ООП в дельфи: свойства, события.
А сверху до кучи добавлен With.
Хороший пример как делать не надо.
...
Рейтинг: 0 / 0
28.02.2019, 17:22
    #39780537
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
Dimonka,

"как правило это заплатка за 5 минут" (с)

если же это останется в окончательном коде - тогда да, ахтунг.

кстати, даже в виде заплатки соответствует тезису 21821776

Ariochwith больше 5-6 строк размером - это поиск сюрпризов.
...
Рейтинг: 0 / 0
28.02.2019, 17:24
    #39780538
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
AriochDimonka,

"как правило это заплатка за 5 минут" (с)

если же это останется в окончательном коде - тогда да, ахтунг.

кстати, даже в виде заплатки соответствует тезису 21821776

Ariochwith больше 5-6 строк размером - это поиск сюрпризов.

Nope. Повторюсь, просто с умом использовать.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  with qDocumentRolesEdit do
  begin
    Transaction.StartTransaction;
    try
      ParamByName('AOPERATION').Value := 2;
      ParamByName('ID').Value := cdsDocumentRoles.FieldByName('ID').Value;
      ParamByName('ID_DOCUMENT_TYPE').Value := Null;
      ParamByName('ID_DOC$ROLE_TYPE').Value := Null;
      ParamByName('STATE').Value := Null;
      ParamByName('IS_PARENT').Value := Null;
      ParamByName('IS_TRUSTEE').Value := Null;
      ParamByName('IS_AUTHORIZED_REPRESENTATIVE').Value := Null;
      ParamByName('IS_PROHIBITION').Value := Null;
      ExecQuery;

      Transaction.Commit;
    except
      Transaction.Rollback;
    end;
  end;
...
Рейтинг: 0 / 0
28.02.2019, 17:28
    #39780543
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
RackotPro
Код: pascal
1.
2.
3.
    except
      Transaction.Rollback;
    end;



ты бы хоть raise для приличия вставил что ли....


RackotPro
Код: pascal
1.
ParamByName


RackotPro
Код: pascal
1.
FieldByName



Желательно вызывать один единственный раз, а не при каждом выполнении запроса.
...
Рейтинг: 0 / 0
28.02.2019, 17:30
    #39780545
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
Arioch, всё, я пойду вскрою вены, победил, ты царь, бог и код твой священен. Жесть xD
...
Рейтинг: 0 / 0
28.02.2019, 17:34
    #39780550
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Incompatible types
RackotProИ позже когда сюда вернёшься, не очень удобно будет листать "милион милион алых строк", что бы убрать или заменить тот самый var.

просто однажды ты переименуешь btnA во что-то другое

в своей прогармме не переименуешь? даже через 3-4 года?
ну так в чужой переименуешь, которую тебе передадут.

и у тебя станет внезапно включаться btnA совсем другой формы.


Для экспериментов на 5 минут во время отладки это подходит.
Но добившись результата все же лучше переписать экспериментальную затычку в надёжный код.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Incompatible types / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]