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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2010, 21:43   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Procedure Switch

Хочу сделать процедуру Switch для смены местами двух объектов или переменных. Типа такого:
Код:
Procedure Switch(Var First, Second : Variable);
Var
 PP : Variable;
Begin
 PP := First;
 First := Second;
 Second := PP;
End;
Думаю, что там надо использовать GetMem и FreeMem, вот только я не силен в таких делах.

P.S Надеюсь объяснил понятно, я сейчас не очень в форме. Температурю.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 06.09.2010, 23:12   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Ну как вариант примени указатели, тогда чтобы обменять их местами просто перепиши указатели, а не сами объекты
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 06.09.2010, 23:13   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

А кого использовать в качестве PP?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 06.09.2010, 23:16   #4
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

pointer, pointer
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 06.09.2010, 23:27   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Код:
Procedure Switch(Var First, Second : ... );
Var
 PP : Pointer;
Begin
 PP := @First;
 First := Second;
 Second := ^PP;
End;
Так, чтоль? Тогда вопрос, что использовать вместо многоточия?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 06.09.2010, 23:44   #6
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Код:
Procedure Switch(var First, Second : pointer);
Var
 PP : Pointer;
Begin
 PP := First;
 First := Second;
 Second := PP;
End;

procedure TForm1.Button1Click(Sender: TObject);
var obj1,obj2:TStringList;
    pp1,pp2:pointer;
begin
  obj1:=TStringList.Create;
  obj1.Text:='TEXT1';
  New(pp1); pp1:=@obj1;
  obj2:=TStringList.Create;
  obj2.Text:='TEXT2';
  New(pp2); pp2:=@obj2;

  showmessage('OBJ1 - '+TStringList(pp1^).Text+', OBJ2 - '+TStringList(pp2^).Text);
 Switch(pp1,pp2);
 showmessage('OBJ1 - '+TStringList(pp1^).Text+', OBJ2 - '+TStringList(pp2^).Text);
  obj1.Free;
  obj2.Free;
end;
Алсо процесс создания указателей к обьектам можно автоматизировать
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 07.09.2010, 08:56   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Alex Cones
А как ты собираешся узнавать размер меняемых данных?
И зачем это?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.09.2010, 11:09   #8
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
И зачем это?
Очень часто приходится менять местами две величины. Причем часто они имеют нестандартные типы. Вот и пытаюсь наколдовать.
Цитата:
А как ты собираешся узнавать размер меняемых данных?
А смысл? Кстати, нашел, как называется тот тип - Variable. Не лучше ли его будет заюзать?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 07.09.2010, 11:31   #9
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию

Код:
var
  pp: Variant;
  First, Second: Variant;
begin
  First := 'String';
  Second := 1;
  ShowMessage('First = ' + String(First) + #13 +
              'Second = ' + String(Second));
  pp := First;
  First := Second;
  Second := pp;
  ShowMessage('First = ' + String(First) + #13 +
              'Second = ' + String(Second));
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Старый 07.09.2010, 12:26   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Код:
procedure Switch1 (var First, Second; ASize: Integer);
var
  i: Integer;
  f, s: PChar;
  c: Char;
begin
  f := PChar(@First);
  s := PChar(@Second);
  for i := 0 to ASize-1 do begin
    c := f[i];
    f[i] := s[i];
    s[i] := c;
  end;
end;

procedure Switch2 (var First, Second; ASize: Integer);
var
  p: Pointer;
begin
  p := SysGetMem (ASize);
  Move (First , p^    , ASize);
  Move (Second, First , ASize);
  Move (p^    , Second, ASize);
  SysFreeMem (p);
end;


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  r1, r2: Real;
  i1, i2: Integer;
  s1, s2: String;
begin
  r1 := 1623;
  r2 := -2.847e-5;
  Switch1 (r1, r2, SizeOf(r1));
  ShowMessage (FloatToStr (r1) + #13 + FloatToStr (r2));

  i1 := 1623;
  i2 := 2847;
  Switch2 (i1, i2, SizeOf(i1));
  ShowMessage (IntToStr (i1) + #13 + IntToStr (i2));

  s1 := '1623';
  s2 := '2847';
  Switch2 (Pointer(s1), Pointer(s2), Length(s1));
  ShowMessage (s1 + #13 + s2);
end;
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Procedure ALABAMA Паскаль, Turbo Pascal, PascalABC.NET 3 20.05.2010 21:06
procedure Insert keen86nv Помощь студентам 2 01.04.2010 17:37
Procedure SQL Neymexa SQL, базы данных 7 23.03.2010 09:29
procedure! please! help! NeAlSe Помощь студентам 2 15.06.2008 15:38
function procedure Toxa Microsoft Office Access 1 28.11.2007 18:32