Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 17.07.2011
Сообщений: 143

Запоминание количества входов

16.03.2015, 20:56. Показов 3684. Ответов 57
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ, я снова в ступоре( Пытаюсь научить программу понимать, на какой вход нужно отрисовать связь. Т. е., если у меня есть элемент на 2 входа, я создаю к нему связь от другого элемента - она проводится к первому входу, если тяну связь от второго элемента - связь идет ко второму элементу. Если входы закончились - ничего не происходит и связь просто не рисуется.

Попробовал (по нубски естественно) написать рабочий вариант с запоминанием количества использованных входов в свойстве .Tag, но, как и ожидалось, не работает правильно.

Подскажите, как это вообще реализовать? Проект прилагается.

ВАЖНО! Отслеживание по .Tag делал только для первого элемента на 2 входа (на панели интерфейса, элемент & который).
Вложения
Тип файла: rar forum.rar (390.7 Кб, 8 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2015, 20:56
Ответы с готовыми решениями:

Защита входов МК
Всем привет! Озадачился тут выбором способа защиты входов контроллера. Пока выбираю между двумя (просто детали для обоих вариантов есть в...

Перемена знаков входов на ОУ
Как поменять знаки входов с +- на -+ в операционном усилителе?

Защита входов микроконтроллера
ПОдскажите - подойдут ли такие http://www.ti.com/lit/ds/sdls017a/sdls017a.pdf диоды для защиты микроконтроллера от 12 вольт? Уточню - это...

57
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
18.03.2015, 09:49
Студворк — интернет-сервис помощи студентам
Pascal
1
2
3
4
      if (usedEntries < numEntries) and
         (SrcElement.Left < Self.Left - 40) and
         (ConnectLst.IndexOf(CreateConnectRec(SrcElement, Self, 0)) = -1) // <--- Вот так. 
      then
1
1 / 1 / 0
Регистрация: 17.07.2011
Сообщений: 143
18.03.2015, 10:11  [ТС]
volvo, а я пытался проверить на существование строки что-то вроде

Delphi
1
if(CreateConnectRec(SrcElement, Self, 0))
Но сразу понял, что эта разные форматы и они не сравниваются).

Остались последние штрихи с этим редактором: если вдруг на схеме какой-то элемент станет ненужен, то его необходимо удалить, а вместе с ним и все его связи.

Начал с самого простого - назначить для этой операции кнопку и удалить из памяти сам элемент, но не могу отловить нажатие кнопки, так как ss не дает отследить состояние клавиши Delete. Посмотрел примеры. но там везде через событие KeyDown, а у меня вся обработка идет в MouseDown. Как определить?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
18.03.2015, 10:27
Ну, на щелчок правой кнопкой мыши повесь удаление элемента. Его очень просто отследить...

Только вот с удалением - не так все просто Нельзя удалить элемент из его собственного метода. Это еще хуже, чем пилить сук, на котором сидишь. Я обычно пользуюсь таймером (изначально не работающим, с Enabled = False) в подобном случае. То есть, подготавливаешь все к удалению, вычищаешь все связи, записываешь в какую-то переменную ссылку на объект, который надо удалить, и запускаешь таймер (Enabled := True) с не очень большим интервалом, скажем, 100 ms. Таймер срабатывает уже тогда, когда выполнение метода удаляемого объекта завершилось, идет в ту самую переменную, удаляет объект, и опять выставляет сам себе Enabled = False. До следующего раза
1
1 / 1 / 0
Регистрация: 17.07.2011
Сообщений: 143
18.03.2015, 10:53  [ТС]
volvo, а как удалять связи, если я по сути знаю только источник (или приемник в зависимости от связи)?

То есть мне нужно удалять строкой примерно как эта

Delphi
1
ConnectLst.Remove(CreateConnectRec(SrcElement, Self, 0));
Только операция будет в два этапа наверное, когда мы удаляем строки, где Self это источник, а затем, где он же приемник. Или я чет не так понял?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
18.03.2015, 12:35
Вот подправленный метод MouseDown полностью:
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
procedure TLogicalElement.MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
 
  procedure UpdateConnects(updateDst : TLogicalElement;
                           updateEntryNum : integer);
  var
    ix : integer;
    foo : TConnectRec;
  begin
    // для всех элементов списка связей, где dst = updateDst,
    // уменьшаем dstEntry на 1, если он больше dstEntryNum:
    for ix := 0 to Pred(ConnectLst.Count) do
      if (ConnectLst[ix].dst = updateDst) and (ConnectLst[ix].dstEntry > updateEntryNum) then
      begin
        foo := ConnectLst[ix];
        foo.dstEntry := foo.dstEntry - 1;
        ConnectLst[ix] := foo;
      end;
    // уменьшаем число задействованных входов
    Dec(updateDst.usedEntries);
  end;
 
var
  ix : integer;
  dstEntryNum : integer;
  foo : TConnectRec;
begin
  inherited MouseDown(Button, Shift, X, Y);
  tx:=X; ty:=y;
  isDragging := Shift = [ssLeft];
  if Button = mbLeft then
  begin
 
  if ssCtrl in Shift then
  begin
    OddMouseClick := not OddMouseClick;
    if OddMouseClick then
    begin
      // источник
      SrcElement := Self;
    end
    else
    begin
      // приемник...
      // проверяем, есть ли свободные входы в приемнике
      if (usedEntries < numEntries) and
         (SrcElement.Left < Self.Left - 40) and
         (ConnectLst.IndexOf(CreateConnectRec(SrcElement, Self, 0)) = -1)
      then
      begin
        Inc(usedEntries);
        ConnectLst.Add(CreateConnectRec(SrcElement, Self, usedEntries));
        RedrawConnections;
      end
      else
      begin
        ShowMessage('Невозможно добавить соединение');
        TLogicalElement.SrcElement := nil;
      end;
    end;
  end // конец если Ctrl зажат
  else if ssShift in Shift then
  begin
    OddMouseClick := not OddMouseClick;
    if OddMouseClick then
    begin
      // источник
      SrcElement := Self;
    end
    else
    begin
      // приемник...
      // проверяем, есть ли уже связь: находим ее индекс в списке
      foo := CreateConnectRec(SrcElement, Self, 0);
      ix := ConnectLst.IndexOf(foo);
      if ix > -1 then
      begin
        // ага, связь есть. Запоминаем номер входа приемника:
        dstEntryNum := ConnectLst[ix].dstEntry;
        // теперь удаляем связь
        ConnectLst.Delete(ix);
 
        UpdateConnects(Self, dstEntryNum);
      end;
 
      RedrawConnections;
    end;
  end; // конец если Shift зажат
  end // left mouse button
  else
  begin
    // right mouse button = delete self
    for ix := Pred(ConnectLst.Count) downto 0 do
      if ConnectLst[ix].src = Self then
      begin
        // если удаляемый элемент - ИСТОЧНИК связи, то сначала надо обновить
        // приемник
        UpdateConnects(ConnectLst[ix].dst, ConnectLst[ix].dstEntry);
        // и только теперь удалять связь
        ConnectLst.Delete(ix);
      end
      else if ConnectLst[ix].dst = Self then
      begin
        // если удаляемый элемент - ПРИЕМНИК связи - то ничего делать не надо,
        // просто удалить связь, на другие элементы это не повнияет
        ConnectLst.Delete(ix);
      end;
 
    SrcElement := self;
    Form1.Timer1.Enabled := True;
  end;
end;
, вот обработчик тика таймера:
Pascal
1
2
3
4
5
6
7
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Assigned(TLogicalElement.SrcElement) then
    TLogicalElement.SrcElement.Free;
  (Sender as TTimer).Enabled := False;
  RedrawConnections;
end;
Изначально в дизайнере таймеру выставлены свойства Interval=100 и Enabled=false... Прекрасно удаляются элементы, и отдельные связи.
1
1 / 1 / 0
Регистрация: 17.07.2011
Сообщений: 143
18.03.2015, 14:15  [ТС]
volvo, спасибо) теперь буду настраивать остальной интерфейс) Правда столкнулся еще с одним неудобством: на скрине я собрал ситуацию, когда из одного элемента выходит сразу 6 связей - это нормально (представим, что первый элемент это вход X1, а конечные элементы - это логические элементы И). Все их связи пересекает связь еще двух элементов и становится непонятно, где же есть электрическая связь - путаница.

Думаю, нужно рисовать точки в местах пересечений, где они нужны. Есть идея при отрисовке связей брать имя источника и искать с списке структур совпадение. Допустим, он рассчитает, что записей с источником Elem0 будет 6 штук, тогда через условие нарисуем на втором изгибе связей точку, игнорируя первую и последнюю связи, так как там это не ответвление, а естественные линии.

Собственно вопрос в чем, как мне сделать этот поиск по структуре и вообще можно ли так? Вроде при удалении элемента или связей записи из структуры тоже будут удаляться, поэтому ''точек в воздухе'' не будет оставаться, так как идет постоянная перерисовка.
0
1 / 1 / 0
Регистрация: 17.07.2011
Сообщений: 143
18.03.2015, 14:17  [ТС]
volvo, забыл скрин) перезалил
Миниатюры
Запоминание количества входов  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
18.03.2015, 15:06
Лучший ответ Сообщение было отмечено Mazanton как решение

Решение

Ну, пока только так:
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
procedure RedrawConnections;
var
  R, T : TConnectRec;
  isIntersects : boolean;
  c1X, c1Y, c2X, c2Y, T1X, T1Y, T2Y : integer;
begin
  Form1.Holst.Repaint;
 
  for R in ConnectLst do
  begin
    c1X:= R.src.Left + 48;
    c1Y:= R.src.Top + 23;
    c2X:= R.dst.Left+1;
    c2Y:= R.dst.Top + 15 + Pred(R.dstEntry)*16;
    with Form1.Holst.Canvas do
    Begin
      Pen.Width:=1;
      Line(c1X,c1Y,c1X + 5,c1Y);
      Line(c1X + 5,c1Y,c1X + 5,c2Y);
      Line(c1X + 5,c2Y,c2X,c2Y);
 
 
      isIntersects := false;
      for T in ConnectLst do
      begin
        T1X := T.src.Left + 48;
        T1Y := T.src.Top + 23;
        T2Y := T.dst.Top + 15 + Pred(T.dstEntry)*16;
        isIntersects := isIntersects or
          ((R.src = T.src) or (R.dst = T.dst)) and
          ((c1X = T1X) and (C2y > Min(T1Y, T2Y)) and (C2y < Max(T1Y, T2Y)));
      end;
      Brush.Color:=clRed;
      if isIntersects then  Ellipse((c1X+5)-5, c2Y-5, (c1X+5)+5, c2Y+5);
 
    End;
  end;
end;
, но есть идея, как сделать гораздо более эффективно, и минимизировать изменения и копипаст кода при добавлении остальных типов элементов. Или сегодня вечером, или завтра днем попробую набросать...

Задачка уж очень интересная
1
1 / 1 / 0
Регистрация: 17.07.2011
Сообщений: 143
18.03.2015, 15:21  [ТС]
volvo, странно, но компилятор ругается на строчку

Delphi
1
((c1X = T1X) and (C2y > Min(T1Y, T2Y)) and (C2y < Max(T1Y, T2Y)));
unit1.pas(89,46) Hint: Parameter "CloseAction" not used
unit1.pas(490,38) Error: Identifier not found "Min"
unit1.pas(490,64) Error: Identifier not found "Max"
unit1.pas(506) Fatal: There were 2 errors compiling module, stopping
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
18.03.2015, 15:23
Pascal
1
Uses Math;
1
1 / 1 / 0
Регистрация: 17.07.2011
Сообщений: 143
18.03.2015, 15:33  [ТС]
volvo, да, точно)) заработало, но есть оговорки в работе. На первом скрине обычная ситуация, все нормально, на втором я создал ситуацию, когда возникает логическая ошибка (я просто переместил второй слева элемент и он совместил связи, что по логике невозможно, на самом деле сложно сказать, что делать в подобных ситуациях, но, думаю, точка не нужна в них.)

Есть и еще один момент, когда (3 скрин) я выстраиваю первый элемент в одну линию с приемником, то точка пропадает, хотя в месте скрещивания выходит 2 провода, а значит точка нужна.
Миниатюры
Запоминание количества входов   Запоминание количества входов   Запоминание количества входов  

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
18.03.2015, 16:11
Знаешь, у меня складывается такое ощущение, что это МОЕ задание. Давай дальше сам... Думать начинай, уже и так практически все реализовано... А вместо кого-то делать я вообще не намерен. Так что от темы отписываюсь. Твоего кода на сотню сообщений - жалкие несколько строк, одна-единственная "спасибка". Я бы за ответы на такое количество вопросов по форуму репутацию на пару сотен баллов мог увеличить, на фиг мне просто так это делать, да еще и задачу твою решать на халяву, ты не думал никогда? Удачи...
1
1 / 1 / 0
Регистрация: 17.07.2011
Сообщений: 143
18.03.2015, 16:23  [ТС]
volvo, сорри, если чем обидел, я писал тебе в лс же, что готовь отблагодарить за помощь в проекте - ответа нет(
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
19.03.2015, 18:27
Цитата Сообщение от Mazanton Посмотреть сообщение
(я просто переместил второй слева элемент и он совместил связи, что по логике невозможно, на самом деле сложно сказать, что делать в подобных ситуациях, но, думаю, точка не нужна в них.)
В новой версии это поправлено.

Цитата Сообщение от Mazanton Посмотреть сообщение
Есть и еще один момент, когда (3 скрин) я выстраиваю первый элемент в одну линию с приемником, то точка пропадает, хотя в месте скрещивания выходит 2 провода, а значит точка нужна.
А вот с этим - да, пока никак не получается исправить...
Вложения
Тип файла: 7z thread1396655.7z (69.1 Кб, 6 просмотров)
1
1 / 1 / 0
Регистрация: 17.07.2011
Сообщений: 143
19.03.2015, 23:42  [ТС]
volvo, спасибо огромное)! Работает супер) тот мелкий недочет можно и не брать во внимание, он не мешает функционированию. Можете проконсультировать еще по некоторым вопросам? Пока только в плане алгоритмизации.
0
1 / 1 / 0
Регистрация: 17.07.2011
Сообщений: 143
20.03.2015, 15:33  [ТС]
volvo, у меня возник вопрос. Я внедрил в интерфейс еще один элемент на панель - ключ (ну или вход, источник сигнала). Прописал везде необходимый код, но вот с массивом высот и подгрузкой картинки не смог разобраться полностью. В общем весь интерфейс был завязан на индекс листбокса, а этот элемент попадает на холст сразу, без выпадающего списка.

Я добавил в массив запись E_0

Delphi
1
TEntries = ( E_0, E_2, E_3, E_4 );
Затем

Delphi
1
Heights : array[TEntries] of integer = ( 13, 48, 63, 79);
Вот именно эти изменения и повлекли за собой "сбой".

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

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
constructor TLogicalElement.CreateElement(AOwner: TComponent;
  AParent: TWinControl; AType: string; AnEntries: TEntries);
begin
  inherited Create(AOwner);
  Parent := AParent;
  numEntries := 2 + Ord(AnEntries);
  usedEntries := 0;
 
  Width := 48;
  Height := Heights[AnEntries];
 
  Picture.LoadFromFile(Format('img/elem_%s-%d.png', [AType, numEntries]));
end;
Подскажи, пожалуйста, как правильно поставить условие, так как на схеме будет еще два аналогичных элемента.


На словах достаточно сложно объяснить суть проблемы, поэтому приложил проект, там все сразу станет понятно.
Вложения
Тип файла: rar forum.rar (2.42 Мб, 5 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
20.03.2015, 15:52
Добавить E_0 не первым, а последним, например:
Pascal
1
2
3
TEntries = (E_2, E_3, E_4,  E_0);  
// ...
Heights : array[TEntries] of integer = (48, 63, 79, 13);
это будет работать безо всяких добавлений условий, а вот если будут добавляться еще элементы с бОльшим количеством входов (с 5-ю, 6-ю, например), то добавлять их ПЕРЕД E_0... И высоты, соответственно, тоже перед 13...
1
1 / 1 / 0
Регистрация: 17.07.2011
Сообщений: 143
20.03.2015, 16:31  [ТС]
volvo, но в этом случае у этого нового элемента по умолчанию ставится 2 свободных входа, а ведь он является началом схемы и не может иметь вход.

И еще один вопрос по поводу отрисовки точки выхода провода. У этого нового элемента выход находится на другой высоте и строка

Поидее это должна учитывать строка

Delphi
1
Result.Top := Conn.src.Top + (Conn.src.Height div 2) - (Pred(Conn.src.Height) mod 2);
Но почему-то выход значительно смещен
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
20.03.2015, 16:46
Pascal
1
E := TLogicKeyIn.CreateLogic(Self, Holst, E_0);
при создании, и чуть-чуть поменять конструктор:
Pascal
1
2
3
4
5
6
7
 { TKeyIn }
constructor TLogicKeyIn.CreateLogic(AOwner: TComponent; AParent: TWinControl;
  AnEntries: TEntries);
begin
  inherited CreateElement(AOwner, AParent, 'keyin', AnEntries);
  numEntries := 0; // Вот оно...
end;
, только придется название картинки поменять на elem_keyin-5.png. А чтобы убрать смещение, высоту в массиве Heights выставь не в 13, а в 15, тогда смещения не будет... Все вышесказанное остается в силе, E_0 добавлен в конец перечисления...
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
20.03.2015, 16:48
Цитата Сообщение от Mazanton Посмотреть сообщение
выход значительно смещен
Значительно - не было. Было смещение на 1 или 2 пикселя, сейчас этого тоже нет:
Миниатюры
Запоминание количества входов  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.03.2015, 16:48

Защита входов АЦП
Здравствуйте! Вопрос стоит в защите входов АЦП, процессор Silabs C8051F350. Защита нужна от перенапряжения причём с минимальным...

Защита входов МК от помех
Здравствуйте, интересует следующий вопрос и возможные пути его решения. Есть МК 1882ВЕ53У, также есть рабочая схема устройства(в...

Счетчик входов в рекурсию
Привет товарищи. Имею простой вопрос. У меня метод WunderRek, который вызывается рекурсивно. Мне необходимо подсчитать количество вызовов...

Переключение входов монитора
Ситуация. Я имею на работе два ПК и один монитор. Зачем - не спрашивайте. Один Пк подключен через цифровой вход, второй через аналоговый....

Неполадки USB входов
Здравствуйте, имеется такая проблема: при подключении флешек к одному компьютеру они сначала определяются и работают, но после отключения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru