Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Вниз

Задачки по Delphi   Найти похожие ветки 

 
XProger ©   (2006-10-04 19:48) [0]

Предлагаю совместными усилиями придумывать наисложнейшие задачки по Delphi. Заметьте, именно по Delphi, а не по математике, алгоритмизации и т.п.
Язык программирования таит в себе кучу вкусностей, о которых никто нигде (даже в хелпе !!!) не пишет.

Итак, я начинаю :)
Задача
Имеется код:(******** ИЗБАВИТЬСЯ ********)
type
 TVector = record
   X, Y, Z : Single;
 end;

 TRGB = record
   R, G, B : Byte;
 end;

 TVertex = packed record
   Color  : TRGB;
   Vertex : TVector;
   Normal : TVector;
 end;
(****************************)

var
 v : array [0..2] of TVertex;
 i : Integer;
begin

(******** ИЗБАВИТЬСЯ ********)
// Первая вершина всегда красного цвета
 v[0].Color.R := 255;
 v[0].Color.G := 0;
 v[0].Color.B := 0;
// Вторая вершина всегда в позиции (0, 0, 0)
 v[1].Vertex.X := 0;
 v[1].Vertex.Y := 0;
 v[1].Vertex.Z := 0;
// Третья вершина всегда с нормалью (0, 1, 0)
 v[2].Normal.X := 0;
 v[2].Normal.Y := 1;
 v[2].Normal.Z := 0;
(****************************)

// Рисуем треугольник с постоянно меняющимися параметрами вершин
 for i := 0 to 2 do
   with v[i] do
   begin
   // Меняем цвет всех вершин, проме первой
     if i <> 0 then
     begin
       Color.R := random(256);
       Color.G := random(256);
       Color.B := random(256);
     end;
   // Меняем позицию всех вершин, кроме второй
     if i <> 1 then
     begin
       Vertex.X := random * 10 - 5;
       Vertex.Y := random * 10 - 5;
       Vertex.Z := random * 10 - 5;
     end;
   // Меняем нормали всех вершин, кроме третьей
     if i <> 2 then
     begin
       Normal.X := random * 1 - 0.5;
       Normal.Y := random * 1 - 0.5;
       Normal.Z := random * 1 - 0.5;
     end;
   // Вызов процедуры передечи вершины в конвейер
     SetVertex(@v[i]);
   end;
end.


Вопрос
Используя только секцию var, избавиться от помеченных блоков кода. При этом получить тот же результат что даёт текущий код.
Процедура SetVertex принимает указатель типа Pointer.
Все изменения кода допускаются только в секции var (!!!)
Помеченного кода "ИЗБАВИТЬСЯ" в ответах быть не должно!
Удачи!

P.S.
 Всех, кому задавал эту задачу ранее - прошу не беспокоиться ;)


 
Ketmar ©   (2006-10-04 19:52) [1]

угу. в документации не упоминается, ибо предполагают, что с языком, на котором пишешь, знаком. например, знаком с тем, что можно описывать и присваивать без дополнительных блоков. %-)


 
Palladin ©   (2006-10-04 19:53) [2]

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

школа короче... 10-11 класс...


 
MeF Dei Corvi ©   (2006-10-04 20:12) [3]


> что такое данные и как они распологаются в памяти вышеприведенное
> интереса не представляет...

Тут задача не в этом. Тут задача на знания некоторых особенностей синтаксиса языка, т.к. изменения допускаются только в секции var.


 
Чапаев ©   (2006-10-04 20:17) [4]

Ну и? Ты рекомендуешь сделать var a:array of record record с инициализацией? Руки за такое отбивать без права пришивания.

Твоё счастье, не попался ты моему экс-шефу, он бы и за array [0..2] по ушам надавал...


 
Ketmar ©   (2006-10-04 20:20) [5]

>[4] Чапаев(c) 4-Oct-2006, 20:17
>Твоё счастье, не попался ты моему экс-шефу, он
>бы и за array [0..2] по ушам надавал...
а тут-то за что? %-)


 
TUser ©   (2006-10-04 20:21) [6]

> он бы и за array [0..2] по ушам надавал...

А в чем криминал?


 
Чапаев ©   (2006-10-04 20:23) [7]

А потому что надо

type
 TArrayIndex=0..2;
 TArray=array [TArrayIndex] of TЕщёКакаяТоФигня

И чтоб потом, не дай бог, не использовался Integer в качестве индекса массива. ;-)


 
Ketmar ©   (2006-10-04 20:23) [8]

>[6] TUser(c) 4-Oct-2006, 20:21
>А в чем криминал?
телепатор подсказывает, что дядя "повёрнут" на строгой типизации. %-)


 
Ketmar ©   (2006-10-04 20:23) [9]

во. телепатор сработал верно. %-)


 
MeF Dei Corvi ©   (2006-10-04 20:25) [10]


>  Ты рекомендуешь сделать var a:array of record record с
> инициализацией? Руки за такое отбивать без права пришивания.

Для решения поставленной задачи - да :) А вообще, конечно, "Руки за такое отбивать без права пришивания."


 
XProger ©   (2006-10-04 20:45) [11]

Для начала хотелось бы увидеть решение...
Эта задача наипростейшая среди тех, что имеются у меня в запасе ;)


 
Ketmar ©   (2006-10-04 20:48) [12]

>[11] XProger(c) 4-Oct-2006, 20:45
>Для начала хотелось бы увидеть решение...
а зачем? нецелесообразно. и -- не приведи ангелы, ещё прочтёт кто из начинающих. и станет так же писать...


 
Чапаев ©   (2006-10-04 20:49) [13]

> Для начала хотелось бы увидеть решение...

Не буду я такую гадость писать. Хотя и мог бы. С такими задачками лучше к недоу{м|ч}кам-сишникам обратиться.


 
XProger ©   (2006-10-04 21:13) [14]

Чапаев, гордый или ленивый? :)
Не хочешь отвечать - не пиши ничего, чего толку лясо точить?


 
Чапаев ©   (2006-10-04 21:17) [15]

> Чапаев, гордый или ленивый? :)

брезгливый


 
Ketmar ©   (2006-10-04 21:17) [16]

>[14] XProger(c) 4-Oct-2006, 21:13
>Чапаев, гордый или ленивый? :)
а ты так и не понял, что в данном случае -- ни то, ни другое?


 
default ©   (2006-10-04 21:17) [17]

подобные задачи навевают скуку...фи


 
Чапаев ©   (2006-10-04 21:21) [18]

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

Объявлял что-то вроде

var
 A:array [1..10] of Integer;
procedure Proc(var Arr:array [1..10] of Integer);


Отказалось компилироваться, конечно.


 
Ketmar ©   (2006-10-04 21:23) [19]

>[18] Чапаев(c) 4-Oct-2006, 21:21
>Отказалось компилироваться, конечно.
а tmt pascal, кажись, проглатывает такое. %-)


 
TUser ©   (2006-10-04 21:23) [20]

Просто поверь - ничего наисложнейшего в твоей задаче нет. Наоборот, есть требование написать тривиальный код, причем втаком стиле, в каком его никто в здравом уцме писать не будет.

Вот поломай голову - как раз на знание языка. Что произойдет в результате следующего кода? Ответить надо, разумеется, не компилируя эту программу

{$apptype console}
procedure P (A: integer); overload;
begin
 writeln ("A is integer")
end;

procedure P (A: shortint); overload;
begin
 writeln ("A is shortint");
end;

begin
 P (10);
end.

Я вот, a priori, ответа не знал.


 
Чапаев ©   (2006-10-04 21:24) [21]

Ну и дура, раз проглатывает


 
Чапаев ©   (2006-10-04 21:26) [22]

Integer, полагаю. Щас проверю.


 
Ketmar ©   (2006-10-04 21:26) [23]

>[21] Чапаев(c) 4-Oct-2006, 21:24
>Ну и дура, раз проглатывает
не факт. иногда удобно. %-)


 
Ketmar ©   (2006-10-04 21:26) [24]

>[22] Чапаев(c) 4-Oct-2006, 21:26
>Integer, полагаю. Щас проверю.
хихик.


 
Чапаев ©   (2006-10-04 21:26) [25]

> [24] Ketmar ©   (04.10.06 21:26)

Ото ж...


 
Ketmar ©   (2006-10-04 21:27) [26]

>[25] Чапаев(c) 4-Oct-2006, 21:26
>Ото ж...
я тоже проверил. %-)


 
Чапаев ©   (2006-10-04 21:28) [27]

> [23] Ketmar ©   (04.10.06 21:26)

Нафиг, нафиг такие удобства... Завтра он окурок мимо урны кинет, послезавтра Родину продаст, а послепослезавтра и вовсе через правое плечо повернётся...


 
Ketmar ©   (2006-10-04 21:29) [28]

>[27] Чапаев(c) 4-Oct-2006, 21:28
>Нафиг, нафиг такие удобства...
ну, не утрируй. [7] -- тоже несколько маразматично. %-)


 
default ©   (2006-10-04 21:32) [29]

TUser ©   (04.10.06 21:23) [20]
это из разряда
"дети, как думаете, где должно находится право, а где лево?"

используется наиболее часто употребительный тип, в Delphi это Integer


 
Чапаев ©   (2006-10-04 21:33) [30]

> [28] Ketmar ©   (04.10.06 21:29)

Ничуть. Всяко правильней индексовую переменную объявлять именно того типа, которым является реальный индекс массива. А если у тебя какой-то невнятный 0..2, то и типа именованного нет. Вообще компилятор не обязан при объявлении
var
 A:array [0..2] of Integer;
 B:array [0..2] of Integer;
считать A и B переменными одного типа.


 
Чапаев ©   (2006-10-04 21:33) [31]

> [29] default ©   (04.10.06 21:32)

;-) Вот я тоже так думал... Оказалось -- излишне оптимистичен.


 
default ©   (2006-10-04 21:35) [32]

Удалено модератором


 
Ketmar ©   (2006-10-04 21:42) [33]

>[30] Чапаев(c) 4-Oct-2006, 21:33
>Вообще компилятор не обязан при объявлении
>var
> A:array [0..2] of Integer;
> B:array [0..2] of Integer;
>считать A и B переменными одного типа.
более того: если он будет так считать, то это глюкавый компилятор. %-)


 
Чапаев ©   (2006-10-04 21:45) [34]

> [33] Ketmar ©   (04.10.06 21:42)

Тогда почему TMT, позволяющий такую мешанину типов, не "нафиг"? ;-)


 
Ketmar ©   (2006-10-04 21:49) [35]

>[34] Чапаев(c) 4-Oct-2006, 21:45
>Тогда почему TMT, позволяющий такую мешанину
>типов, не "нафиг"? ;-)
а где я сказал, что "не нафиг"? я его не использую. %-)


 
palva ©   (2006-10-04 22:05) [36]

Изучать тонкости языка непродуктивно. Тем более, что некоторые нюансы меняются от версии к версии. Куда важнее научиться не торопясь и не задумываясь писать стандартные конструкции для реализации стандартных задач. Причем с правильными отступами, с логичным выбором имен переменных, с правильным выбором стандартных функций.

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


 
XProger ©   (2006-10-04 22:07) [37]

Ладно, раз никто ответа не знает, отвечу сам:
var
 i : Integer;
 v : array [0..2] of packed record
   Color  : record R, G, B : Byte; end;
   Vertex : record X, Y, Z : Single; end;
   Normal : record X, Y, Z : Single; end;
 end = ((Color: (R: 255; G: 0; B: 0)),
        (Vertex: (X: 0; Y: 0; Z: 0)),
        (Normal: (X: 0; Y: 1; Z: 0)));

Обидно, что воспринимаете задачи так надменно. Всякое желание продолжать дискуссию отбивает...
А насчёт "проглатывает" смотрите:
if (a(.i] > Byte(^a)) or (a[i.) < a[i + 1]) then
(
 if (str1 = #13#10) and (str1 > str2) then
   str1 := ^(^П^Р^Е^В^Е^Д#32"МИР"^!^)
);

Delphi это успешно пережёвывает ;)


 
Ketmar ©   (2006-10-04 22:08) [38]

>[37] XProger(c) 4-Oct-2006, 22:07
>Ладно, раз никто ответа не знает
знаем, знаем. %-)

>А насчёт "проглатывает" смотрите:
а с чего бы не "проглатывать"? вполне корректный код.


 
XProger ©   (2006-10-04 22:09) [39]

Ketmar, что означает ^ в данном коде?


 
Ketmar ©   (2006-10-04 22:11) [40]

>[39] XProger(c) 4-Oct-2006, 22:09
>Ketmar, что означает ^ в данном коде?
способ задания символа по его коду. не уверен, что это есть в стандарте, но в TP5 уже точно было. %-) например, ^G -- это #7. %-)


 
Чапаев ©   (2006-10-04 22:12) [41]

Ctrl.
^J==#10
^M==#13
и так далее. Ну и что?


 
XProger ©   (2006-10-04 22:18) [42]

Ketmar, это пережитки прошлого о которых нет упоминания в хелпе к Delphi. То же самое можно сказать и о скобках в условиях... :)


 
Чапаев ©   (2006-10-04 22:27) [43]

Ты о (. и .)? Ну если хелп не читать, то тогда, конечно, можно утверждать, что в хелпе такого нет...


 
XProger ©   (2006-10-04 22:29) [44]

Чапаев, нет, я про скобки ( и )


 
Ketmar ©   (2006-10-04 22:43) [45]

>[44] XProger(c) 4-Oct-2006, 22:29
>Чапаев, нет, я про скобки ( и )
и что в скобках?


 
TUser ©   (2006-10-04 22:54) [46]

> XProger ©   (04.10.06 22:07) [37]

Забавно. Никто не использует такой синтаксис, а оно есть - надо же. Твое решение для [20]? Реальная ситуация, в котоорой можно допустить ошибку. Только, чур, не компилировать и не смотреть посты, в которых дан ответ.


 
Ketmar ©   (2006-10-04 22:57) [47]

>[46] TUser(c) 4-Oct-2006, 22:54
>Забавно. Никто не использует такой синтаксис, а
>оно есть - надо же.
стандарт-с... обратная совместимость, опять же...


 
XProger ©   (2006-10-04 23:00) [48]

TUser, ShortInt будет, т.к. 10 входит в диапозон.


 
Servelat ©   (2006-10-04 23:42) [49]

> [20]
Я бы на месте компилятора заматерился на такую фигню (=. Че за нах, непонятно какую и функцию то выбрать (=.


 
Ketmar ©   (2006-10-04 23:45) [50]

>[49] Servelat(c) 4-Oct-2006, 23:42
всё там понятно. типы-то разные.


 
Servelat ©   (2006-10-05 00:16) [51]

> [50]
да я уж посмотрел. Но родись я компилятором все равно таких авторов бы посылал: 10 приводиться и к тому и к тому типу, так что это место где программист может облажаться, а зачем позволять программисту садиться в лужу (пусть даже и потенциально). Хотя Борланду конечно виднее (=. Но тогда встречный вопрос, а если так (разумееться не компилируя):

procedure P(r: integer); overload;
begin
 writeln("int");
end;

procedure P(r: cardinal); overload;
begin
 writeln("uint");
end;

begin
 P(-10);
 P(10);
end.


 
Ketmar ©   (2006-10-05 00:17) [52]

>[51] Servelat(c) 5-Oct-2006, 00:16
а собственно, где-то в справке я встречал упоминание, что приводится именно к меньшему типу.

или это Оберон был?..


 
Ketmar ©   (2006-10-05 00:18) [53]

а overload вообще зло. %-)


 
isasa ©   (2006-10-05 00:35) [54]

Servelat ©   (05.10.06 00:16) [51]

:)
Так, кто-ж тебе доктор?
Пиши явно

P(integer(-10));
P(cardinal(10));

Ketmar ©   (05.10.06 00:18) [53]

а overload вообще зло. %-)


Абсолютное :)


 
Джо ©   (2006-10-05 00:38) [55]

Да ладно вам, "зло" :) Просто удобный инструмент, которым, однако, нужно пользоваться с осторожностью.


 
Ketmar ©   (2006-10-05 00:46) [56]

>[55] Джо(c) 5-Oct-2006, 00:38
>которым, однако, нужно пользоваться с
>осторожностью.
молотком тоже можно палец ушибить, согласен. но всё равно -- гадость.
...гордо сказал Кэтмар и принялся дописывать очередную перегруженую функцию.


 
Джо ©   (2006-10-05 01:06) [57]

> [56] Ketmar ©   (05.10.06 00:46)
> ...гордо сказал Кэтмар и принялся дописывать очередную перегруженую
> функцию.

Это по-нашему! :b:


 
Германн ©   (2006-10-05 01:40) [58]


> Ketmar ©   (05.10.06 00:46) [56]
>
> >[55] Джо(c) 5-Oct-2006, 00:38
> >которым, однако, нужно пользоваться с
> >осторожностью.
> молотком тоже можно палец ушибить, согласен. но всё равно
> -- гадость.
>

Во-во! Именно так и относится к молотку меньшая из двух моих собачек. Как только его видит, так сразу пытается спрятаться!
Сразу отвечаю на "очевидные" вопросы - её молотком не бил никто и никогда! Просто она боится громких и резких звуков, которые увы возникают при использовании вышеупомянутого!
А как прожить без молотка! :-)


 
Ketmar ©   (2006-10-05 01:44) [59]

>[58] Германн(c) 5-Oct-2006, 01:40
>А как прожить без молотка! :-)
у меня его нет. %-)


 
guav ©   (2006-10-05 01:53) [60]

> [0] XProger ©   (04.10.06 19:48)


Это всё ерунда. Вот вопрос (уже задавал я же здесь):

procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := (x.y[z]);     {1}
Caption := (x.y)[z];     {2}
end;


Оба варианта присвоения Caption могут быть синтаксически правильными.
В каком случае может оказаться, что оба варианта компилируются и выполняются, но {1} всегда присваивает "1" , а {2} присваивает "2"  ?

(Чтобы не использовали свойства с подсчётом вызовов {1} должен всегда присваивать "1", а {2} -всегда "2", не зависимо от порядка их выполнения и наличия вызова другого варианта)


 
guav ©   (2006-10-05 02:01) [61]

вопрос не такой тривиальный, как [0], поэтому разрешается отвечать не только автору векти, но и всем, кому он интересен и кто прошлое обсуждение пропустил ;-)


 
Джо ©   (2006-10-05 02:03) [62]

так x,y,z и в {1} и в {2} одинаковые сущности?


 
Джо ©   (2006-10-05 02:05) [63]

> [62] Джо ©   (05.10.06 02:03)
> так x,y,z и в {1} и в {2} одинаковые сущности?

Фигню, сморозил-с.


 
guav ©   (2006-10-05 02:15) [64]

Можно задачу поставить так:

Привести Unit2, обеспечивающий результат [60]
Оба варианта компилируются и выполняются, но {1} всегда присваивает "1" , а {2} присваивает "2"

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses unit2;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Caption := (x.y[z]);     {1}
 Caption := (x.y)[z];     {2}
end;

end.


 
MBo ©   (2006-10-05 06:01) [65]

О правиле имен :)

McSimm ©   (14.02.02 10:30)
"...подлинное имя воплощает самую суть вещи. Назвать имя - значит обрести над этой вещью власть. Я верно отвечаю, госпожа учительница?"
Урсула Ле Гуин. "Правило имен".

Посмотрите на этот пример и постарайтесь предсказать что попадет в Caption формы при нажатии на Button1. Потом проверьте.
На форме лежат:
  Button1: TButton;
  MyNameIsA: TEdit;
  MyNameIsB: TMemo;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyNameIsA.Text := "Меня зовут A";
MyNameIsB.Text := "Меня зовут B";

MyNameIsA.Name := "Unnamed";
MyNameIsB.Name := "MyNameIsA";

Caption :=   MyNameIsA.Text
end;


 
Джо ©   (2006-10-05 06:24) [66]

> [65] MBo ©   (05.10.06 06:01)

Однако, это просто страшно :0)


 
skyle ©   (2006-10-05 07:31) [67]


> MBo ©   (05.10.06 06:01) [65]


Ну ты даёшь....;-) Мсье тонкий извращенец ;)


 
Gydvin ©   (2006-10-05 07:38) [68]


> MyNameIsA.Text := "Меня зовут A";
> MyNameIsB.Text := "Меня зовут B";
>
> MyNameIsA.Name := "Unnamed";
> MyNameIsB.Name := "MyNameIsA";
>
> Caption :=   MyNameIsA.Text

а в чем прикол

caption= "Меня зовут B";


 
MBo ©   (2006-10-05 07:48) [69]

>skyle
Это не я, находка Максима ;)


 
Gydvin ©   (2006-10-05 08:06) [70]

может ктонить пояснит в чем прикол.


 
MBo ©   (2006-10-05 08:54) [71]

>Gydvin
Так и задача в том, чтобы разобраться в механизме прикола


 
Думкин ©   (2006-10-05 08:56) [72]

> Gydvin ©   (05.10.06 08:06) [70]

Для медитации:

TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
  MyNameisA1 : TEdit;
  MyNameisB1 : TMemo;
 published
  MyNameisA2 : TEdit;
  MyNameisB2 : TMemo;
 end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyNameisA1 := TEdit.Create(self);
MyNameisA1.Parent := self;
MyNameisA1.Left := 5;
MyNameisA1.Top := 1;
MyNameisB1 := TMemo.Create(self);
MyNameisB1.Parent := self;
MyNameisB1.Left := 205;
MyNameisB1.Top := 1;

MyNameIsA1.Text := "Меня зовут A1";
MyNameIsB1.Text := "Меня зовут B1";

MyNameIsA1.Name := "un1";
MyNameIsB1.Name := "MyNameIsA1";

Caption :=   MyNameIsA1.Text;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
MyNameisA2 := TEdit.Create(self);
MyNameisA2.Parent := self;
MyNameisA2.Left := 5;
MyNameisA2.Top := 100;
MyNameisB2 := TMemo.Create(self);
MyNameisB2.Parent := self;
MyNameisB2.Left := 205;
MyNameisB2.Top := 100;

MyNameIsA2.Text := "Меня зовут A2";
MyNameIsB2.Text := "Меня зовут B2";

MyNameIsA2.Name := "un2";
MyNameIsB2.Name := "MyNameIsA2";

Caption :=   MyNameIsA2.Text;
end;


 
ZeroDivide ©   (2006-10-05 09:23) [73]

>>MBo ©   (05.10.06 06:01)
Атпад... Народ, а в QC это кто-нибудь посылал?


 
dmitry99 ©   (2006-10-05 09:38) [74]

поддерживаю [67]


 
clickmaker ©   (2006-10-05 10:27) [75]


> [65] MBo ©   (05.10.06 06:01)

"Меня зовут A"


 
McSimm ©   (2006-10-05 10:38) [76]

Забавно, но для этого фокуса можно использовать, например, TLabel вместо TMemo, у которого вроде и свойство Text отсутствует, однако в Caption будет успешно текст из него извлекаться, что на первый взгляд выглядит несколько фантастично :)

( для тех, кто не знаком с "Правилом Имен", разумеется ;)


 
clickmaker ©   (2006-10-05 10:44) [77]

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


 
alles ©   (2006-10-05 10:46) [78]

( для тех, кто не знаком с "Правилом Имен", разумеется ;)
а скажите пожалуста что гласит это Правило?


 
clickmaker ©   (2006-10-05 10:49) [79]


> что гласит это Правило?

при смене имен меняются ссылки на компоненты. Т.е. как бы сами компоненты меняются местами (в данном случае)


 
XProger ©   (2006-10-05 11:20) [80]

guav, решения пока не знаю, вернусь с работы - подумаю :)
Пока есть идея, что в первом случае происходит обращение к property, а во втором к обычному массиву... как их скрестить в одном классе - нужно думать...


 
McSimm ©   (2006-10-05 11:22) [81]


> а скажите пожалуста что гласит это Правило?



> "...подлинное имя воплощает самую суть вещи. Назвать имя
> - значит обрести над этой вещью власть... "
> Урсула Ле Гуин. "Правило имен".

:))

---
published поля имеют свойство быть доступными по имени, ссылки на компоненты формы для формы являются published полями. TControl.SetName (кажется) осущесвляет поиск среди published своего владельца и адоптацию под новое имя.


 
McSimm ©   (2006-10-05 11:23) [82]

*адаптацию :)


 
ZeroDivide ©   (2006-10-05 13:00) [83]

Мдя... это откровенная бага в VCL... никакое это не правило. Во-первых глюк страшнейший, а во вторых, думаю, там утечка памяти, т.к. Qwner, при уничтожении больше не сможет найти на себе MyNameIsA

Следовало бы поправить, например вот так:

procedure TComponent.SetName(const NewName: TComponentName);
var
 OwnerField: ^TComponent;
begin
 if FName <> NewName then
 begin
   if (NewName <> "") and not IsValidIdent(NewName) then
     raise EComponentError.CreateResFmt(@SInvalidName, [NewName]);
   if FOwner <> nil then
   begin
     FOwner.ValidateRename(Self, FName, NewName);
     OwnerField := FOwner.FieldAddress(FName);
   else
     ValidateRename(nil, FName, NewName);
   SetReference(False, OwnerField);
   ChangeName(NewName);
   SetReference(True, OwnerField);
 end;
end;

procedure TComponent.SetReference(Enable: Boolean; Field: Pointer = nil);
begin
// Для совместимости с остальными вызовами SetReference
   if Field = nil and FOwner <> nil then
     Field :=  FOwner.FieldAddress(FName)

   if Field <> nil then
     if Enable then Field^ := Self else Field^ := nil;
end;

И, к тому же, такой код работал бы, как минимум, в 1.5 раза быстрее, т.к. FieldAddress не вызывалось бы 2 раза!!!


 
McSimm ©   (2006-10-05 14:02) [84]

Если человек пытается менять Name, он наверное знает зачем ему это надо.
Если в этом и есть глюк, то глюк не VCL, а в коде этого программиста. То же и с утечкой памяти - есть разные способы сделать так, чтобы Owner не имел возможности корректно почистить память, это не означает, что VCL имеет отношение к утечке памяти, вызванной трюкачеством программиста.


 
ZeroDivide ©   (2006-10-05 14:13) [85]

Нет уж извините... покажите мне, где написано, что я не могу менять значение какого то определенного поля объекта?

Если человек пытается менять Name, он наверное знает зачем ему это надо.

И если человек пытаеться менять Caption, он наверное знает зачем ему это надо. :))

В общем, отправил на QC. Ибо это Баг!


 
Ketmar ©   (2006-10-05 16:18) [86]

я в своё время этот код запустил. получил когнитивный диссонанс. долго думал.


 
Gydvin ©   (2006-10-05 18:28) [87]


> MBo ©   (05.10.06 06:01) [65]


У меня упорно "Меня зовут B"


> Думкин ©   (05.10.06 08:56) [72]

А вот здесь я увидел - это чудо

procedure TForm1.Button1Click(Sender: TObject);


"Меня зовут А1" )))))

во втором все ровно


 
jack128 ©   (2006-10-05 22:35) [88]

ZeroDivide ©   (05.10.06 13:00) [83]
а во вторых, думаю, там утечка памяти, т.к. Qwner, при уничтожении больше не сможет найти на себе MyNameIsA

наврятли. механизм Components[]/Owner к именам никакого отнашения не имеет.


 
Mystic ©   (2006-10-06 02:21) [89]

А почему обязательно по Delphi? Например, написать го прогамму, играющую в уровень 5 pro дана... Кто напишет --- приз в $10M


 
Ketmar ©   (2006-10-06 02:23) [90]

>[89] Mystic(c) 6-Oct-2006, 02:21
>прогамму, играющую в уровень 5 pro дана...
за такие деньги -- и "го"? приписать ещё нуля три -- может, и взялся бы... %-)


 
Mystic ©   (2006-10-06 02:24) [91]

$10 000 000 это мало???


 
Ketmar ©   (2006-10-06 02:25) [92]

>[91] Mystic(c) 6-Oct-2006, 02:24
>$10 000 000 это мало???
упс. прочитал как 10 дойч-марок. %-)))


 
Gero ©   (2006-10-06 02:27) [93]

> [91] Mystic ©   (06.10.06 02:24)


> $10 000 000 это мало???

Совсем разъелись!


 
Ketmar ©   (2006-10-06 02:31) [94]

>[93] Gero(c) 6-Oct-2006, 02:27
>Совсем разъелись!
"маловато будет!" (ц)



Страницы: 1 2 3 вся ветка

Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.7 MB
Время: 0.036 c
15-1160064127
ananimous
2006-10-05 20:02
2006.10.29
Version Info


15-1159418720
Тульский
2006-09-28 08:45
2006.10.29
Понятие NULL


2-1160722864
проходил мимо решил заглянуть
2006-10-13 11:01
2006.10.29
скопировать файл


6-1149137424
Roman80
2006-06-01 08:50
2006.10.29
Outlook Express


15-1160135080
salexn
2006-10-06 15:44
2006.10.29
Локализация компонент





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский