Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2011, 20:04   #11
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

tgridclass(caller) := tgridclass(sender);

а не проще ли
var
celler: TCustomGrid;

caller:=sender as TcustomGrid;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.04.2011, 20:21   #12
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Вот если бы было немного понятнее, что конкретно надо, а то все как-то абстрактно...Но все же, возможно ТСу стоит посмотреть на паттерны проектирования (наверное порождающие паттерны, хотя точно не скажу, ибо не до конца понял что требуется) - скорее всего найдет он там что-то нужное...
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 07.04.2011, 20:24   #13
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> сам не верю

вы не поверите.. но все эти классы унаследованы от TCustomGrid. Т.е. ваш код работает не потому, что вы поменяли класс у переменной, а потому, что создатели ООП лет за 30 до этого уже всё придумали.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.04.2011, 20:35   #14
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

Его вопрос (как мне кажется)
Не переписывать процедуры (в т.ч. обработчики событий) работающие с таблицей при замене самой таблицы Tstringgrid <-> TdrawGrid.
Решение к какому он пришел и сам
Использовать приведение Tobject к общему предку. TcustomDrawGrid

либо sender as Tstringgrid
либо sender as TDrawGrid
Всегда sender as TcustomDrawGrid
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.04.2011, 20:39   #15
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

давайте я напишу вам код как было и как стало, не буду говорить , что именно такой код нужен к работе, но как пример

было
Код:
procedure TTestForm.SGMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
(Sender as TStringGrid).mousetocell(x,y,c,r);
...
end;

procedure TTestForm.SGMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  (Sender as TStringGrid).mousetocell(x,y,c,r);
  ...
end;

procedure TTestForm.SGSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
(sender as tStringgrid).Cells[acol, arow] := inttostr(acol);
...
end;

procedure TTestForm.SGMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
(sender as tStringgrid).mousetocell(x,y,c,r);
...
end;

procedure TTestForm.SGExit(Sender: TObject);
begin
(sender as tStringgrid).Cells[2,2] := 'a';
...
end;

procedure TTestForm.SGSetEditText(Sender: TObject; ACol, ARow: Integer;
  const Value: String);
begin
caption := (sender as tStringgrid).cells[acol,arow];
...  
end;
стало

Код:
type
  tgridclass = class of tStringgrid;
var 
  caller : tStringgrid;
...
procedure TTestForm.SGMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
tgridclass(caller) := tgridclass(sender);
caller.mousetocell(x,y,c,r);
...
end;

procedure TTestForm.SGMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
tgridclass(caller) := tgridclass(sender);
caller.mousetocell(x,y,c,r);
  ...
end;

procedure TTestForm.SGSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
tgridclass(caller) := tgridclass(sender);
caller.Cells[acol, arow] := inttostr(acol);
...
end;

procedure TTestForm.SGMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
tgridclass(caller) := tgridclass(sender);
caller.mousetocell(x,y,c,r);
...
end;

procedure TTestForm.SGExit(Sender: TObject);
begin
tgridclass(caller) := tgridclass(sender);
caller.Cells[2,2] := 'a';
...
end;

procedure TTestForm.SGSetEditText(Sender: TObject; ACol, ARow: Integer;
  const Value: String);
begin
tgridclass(caller) := tgridclass(sender);
caption := caller.cells[acol,arow];
...  
end;
Как видно, для того чтобы поменять stringgrid на drawgrid надо вручную ВСЁ менять в первом варианте, и только 2 строчки, централизованно , во втором варианте. Иногда у меня бывает такая задача, например все Tbutton надо поменять на Tbitbtn, и я меняю вручную... а так уже гарантированно всё четко, и знаешь , что везде всё приведено к единому стандарту, это как завести константу для часто встречающегося числа.

Кто искушен, уточните, пожалуйста, безопасен ли такой способ ?

УПД. veniside, согласен с Вами, но мне интересен сам принцип вообще, вдруг я буду писать свою какую-то иерархию без определенных принципов наследования, и мне понадобится такой финт
согласен с evg_m желательно в таких ситуациях искать общего предка, я обычно так и делал, но, думаю когда-то может быть необходимым прямо так, например когда у предка не опредлено некое свойство, а у потомков обоих есть

Последний раз редактировалось phomm; 07.04.2011 в 20:43.
phomm вне форума Ответить с цитированием
Старый 07.04.2011, 20:43   #16
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

В первом варианте tStringgrid одни раз везде меняется на TCustomGrid и всё.

Я всё больше сомневаюсь, что вы понимаете, в чём заключается ООП.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.04.2011, 20:44   #17
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

Код:
sender as Tstringgrid
sender as TDrawGrid
Каждую из таких строчек БЕЗОПАСНО заменить на
Код:
sender as TcustomDrawGrid
поскольку это есть общий предок для данных классов.
((sender as TcustomGrid) as TCustomDrawGrid) as TstringGrid
((sender as TcustomGrid) as TCustomDrawGrid) as TDrawGrid
((sender as TcustomGrid) as TCustomDrawGrid) as TDrawGrid
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 07.04.2011 в 20:51.
evg_m вне форума Ответить с цитированием
Старый 07.04.2011, 21:04   #18
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Я бы остановился на варианте (sender as TDrawGrid). Учитывая иерархию классов, он самый правильный. А прямое приведение типов не есть гуд. В данном случае работает, а к примеру с кнопками можно запросто схватить AV.
eduard93 вне форума Ответить с цитированием
Старый 07.04.2011, 22:04   #19
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Мне кажется меня мало поняли, или я сам маленько вас запутал, или в процессе дискуссия отклонилась.

Мне надо чтобы некий сендер (мы задаем его и точно знаем какого он типа) автоматически преобразовывался к переменной-контейнеру caller'y этого же типа, я не хочу всегда заботиться о типе к которому привожу, зачем мне это ? ведь я присваиваю результат переменной этого же типа ! и я хочу чтобы он(результат преобразования сендера) производился автоматически, независимо от типа caller'a.

Вы посмотрите сами, я не привожу разные объекты к некоему другому, я привожу один и тот же тип к нему же самому, просто я хочу чтобы это делалось автоматом, чисто на основании знания о типе caller'a

поясняю ещё )) я завожу тип, для вышеназванных примеров это Tgridclass = class of Tdrawgrid; и завожу caller тоже класса Tdrawgrid , и во всех обработчиках событий этого грида я хочу, чтобы обращение шло через caller (в будущем план, что caller - поле формы, и можно работать с ним через некие методы), и чтобы оно шло, мне надо кастануть переданный в обработчик события sender (который по факту будет Tdrawgrid, но для компилятора на этапе компиляции он всего лишь Tobject , поэтому-то и нужна кастовка), и мне надо делать это автоматом, без заботы о конкретике, ведь конкретика и так уже прописана при объявлении caller'a , и вот знания о типе caller'a я и хочу использовать для такой автоматики.

блин, я знаю что я тяжело/малопонятно пишу ) но тут всё просто мне кажется, я хочу приводить объект к своему собственному типу , причем уже на этапе компиляции, и конечно, автоматически , ни о каких АВ полагаю и речи быть не может, а заниматься уточнением предков для классов менее удобно , вот и все предпосылки
phomm вне форума Ответить с цитированием
Старый 08.04.2011, 00:14   #20
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

На прошлой странице я уже писал, повторю еще раз идею:
Код:
var
  grid:  TDrawGrid;
//...
grid := (sender as TDrawGrid);
grid.чтотам :=...
Этот код будет правильным при условии, что все сендеры будут или класса TDrawGrid или его потомками.
eduard93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов Lanx Помощь студентам 0 06.04.2011 20:24
Шаблоны - нужно создать объект класса abc в котором вместо aa использовался бы объект класса fff? Farrel Общие вопросы C/C++ 2 13.11.2010 17:37
Создание класса с полем типа TStringList. Ошибка при его заполнении Son Общие вопросы Delphi 8 13.04.2010 21:38
Параметр конструктора класса = объект этого класса nazavrik Общие вопросы C/C++ 6 14.02.2010 13:48
Если в классе объявить объект другого класса,будет ли видно переменные первого класса из объекта второго? TwiX Общие вопросы Delphi 3 15.11.2009 00:54