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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2011, 19:12   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Использование одинаковых свойств разных записей.

Существует TXXX и TYYY = record. Предположим, у них есть свойства TTT и RRR. Но кроме этих свойств у каждой из записей есть с десяток других, причем разных между собой.

Как использовать одинаковые свойства разных записей без дубляжа?

Пример:
Код:
 Function GetIndex(Num : Integer; Name : PAnsiChar; ElemType : Integer) : Integer; StdCall; Export; // Get Index of element.
 Var
  I : Integer;
 Begin
  Result := RESULT_NOT_EXISTS;                                                                      // Result initialization.
  Case ElemType Of                                                                                  // In case of...
   ELEM_TYPE_FORM    : For I := 0 To Length(Warehouse.Form) - 1 Do                                  // ...form,
                        If (Warehouse.Form[I].Exists) And                                           // If it exists and ...
                           (Warehouse.Form[I].Name = Name) Then Result := I;                             // have same name.
   ELEM_TYPE_TEXTURE : For I := 0 To Length(Warehouse.Texture) - 1 Do                               // ...texture,
                        If (Warehouse.Texture[I].Exists) And                                        // If it exists and ...
                           (Warehouse.Texture[I].Name = Name) Then Result := I;                          // have same name.
  End;
 End;
И таких "блоков" добавится еще с десяток. Не хотелос бы функцию раздувать.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 28.01.2011 в 19:32.
Alex Cones вне форума Ответить с цитированием
Старый 28.01.2011, 19:40   #2
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

А может лучше решить классами все?
типо
Код:
TT =class
public
 TTT,RRR: variant;
end;
TXXX = class (TT)
public
 // другие параметры
end;

TYYY = class (TT)
public
 // другие параметры
end;
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 28.01.2011, 19:45   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Использование классов в данном проекте не оправдано.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 28.01.2011, 20:07   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Типа Warehouse.<параметр>.Exists? Неа, никак.

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

Form := TForm(Pointer);
Texture := TTexture(PointerWithOffset);
--
А не, так тоже нельзя, инвалид тайпкаст.
С записями точно никак.
пыщь

Последний раз редактировалось JTG; 28.01.2011 в 20:12.
JTG вне форума Ответить с цитированием
Старый 28.01.2011, 20:16   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Жаль... Придется быдлокодить.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 29.01.2011, 09:15   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от JTG
Грязными методами типа собрать все одинаковые поля в начале записей в том же порядке и обращаться по указателю.
Угу. Точно. Так можно сделать:
Код:
type
 pTexture = ^Texture;
 pSquare = ^Square;
 Texture = record
    Name : string;
    Top, Left : integer;
    Image : pointer;
    size  : longint;
 end;
 Square = record
    Name : string;
    Top, Left : integer;
    Color : TColor;
    WidthLine : integer;
 end;

....

procedure SetCommon(var p : pointer; const parName : string;
                      parTop, parLeft : integer );
var pFake : PTexture;
begin
  pFake := p;
  pFake.Name := parName;
  pFake.Top := parTop;
  pFake.Left := parLeft;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  OneTexture : pTexture;
  OneSq : pSquare;
begin
  New(OneSq);
  New(OneTexture);
  SetCommon(pointer(OneSq), 'Proba', 1,100);
  SetCommon(pointer(OneTexture), 'Test of let common', 10,10);
  ShowMessage('sq Name = '+OneSq^.Name+' Texture Name = '+OneTexture^.Name);
end;
только я полностью, на 100% согласен с JTG, иначе, как грязными, подобные методы не назовёшь...
Это уже всё равно как брать указатель и писать БАЙТЫ по заданному смещению.
Шаг вправо, шаг влево - и всё рухнет с грохотом...

короче, Alex, использовать хакерские подходы в реальной большой задаче не рекомендую, а дальше - Вам решать...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.01.2011, 15:04   #7
GreyScall
Пользователь
 
Аватар для GreyScall
 
Регистрация: 01.01.2011
Сообщений: 29
Лампочка

Код:
Type
      TR=Packed Record
            TType: Byte;
            TTT: String;
            RRR: Integer;
            Case Integer Of
                  0:
                        (If_Type0_A, If_Type0_B, If_Type0_C: Integer);
                  1:
                        (If_Type1_A, If_Type1_B, If_Type1_C, If_Type1_D: Byte);
            End;

Var TR1: Array [0..3] Of TR;
Код:
Procedure TForm1.FormCreate(Sender: TObject);
Var i: Integer;
Begin
Randomize;
For i:=0 To 3 Do
      Begin
      TR1[i].TType:=Random(3); // 2);
      TR1[i].RRR:=i;
      Case TR1[i].TType Of
            0:
                  Begin
                  TR1[i].TTT:='Button';
                  TR1[i].If_Type0_A:=Random(100);
                  TR1[i].If_Type0_B:=Random(100);
                  TR1[i].If_Type0_C:=Random(100);
                  End;
            1:
                  Begin
                  TR1[i].TTT:='Image';
                  TR1[i].If_Type1_A:=Random(100);
                  TR1[i].If_Type1_B:=Random(100);
                  TR1[i].If_Type1_C:=Random(100);
                  TR1[i].If_Type1_D:=Random(100);
                  End;
            End;
      End;
End;
Код:
Procedure TForm1.Button1Click(Sender: TObject);
Var i: Integer; S: String;
Begin
S:='';
For i:=0 To 3 Do
      Begin
      S:=S+IntToStr(TR1[i].RRR)+') ';
      Case TR1[i].TType Of
            0:
                  S:=S+TR1[i].TTT+':'#9+IntToStr(TR1[i].If_Type0_A)+', '+IntToStr(TR1[i].If_Type0_B)+', '+IntToStr(TR1[i].If_Type0_C);
            1:
                  S:=S+TR1[i].TTT+':'#9+IntToStr(TR1[i].If_Type1_A)+', '+IntToStr(TR1[i].If_Type1_B)+', '+IntToStr(TR1[i].If_Type1_C)+', '+IntToStr(TR1[i].If_Type1_D);
            Else
                  S:=S+'UnKnown Type';
            End;
      S:=S+#13#10;
      End;
ShowMessage(S);
End;
P.S. SizeOf(TR)==21
Regards, GreyScall.
GreyScall вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одновременное удаление записей в разных таблицах Lkhasa БД в Delphi 9 16.12.2010 13:21
Создает 2 одинаковых файла в 2ух разных местах.. Человек_Борща Общие вопросы Delphi 1 27.07.2010 22:22
Задача на использование файлов и записей Alt+F4 Помощь студентам 7 21.05.2009 20:29
Как посчитать кол-во разных записей в столбце и сделать двойную сортироку katlis Microsoft Office Excel 2 16.03.2009 17:09
Параметр TTAble определяющий кол-во одинаковых записей в таблице Таня84 БД в Delphi 4 09.02.2007 14:51