Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26149
Рейтинг: 2127
#1: 2006-10-15 02:44:30 ЛС | профиль | цитата
На форуме пробегало желание иметь глобальную переменную с верхней точкой, вот выкладываю. Имеет верхнюю точку Data и событие onValue.
А вот исправленная версия с примером (2.9 кБ).
http://hiasm.hexshock.com/xf//getfile/4410
карма: 22

0
файлы: 1_GlobalVarEx.zip [2.3KB] [823]
Ответов: 9906
Рейтинг: 351
#2: 2006-10-15 10:32:31 ЛС | профиль | цитата
А это что за наскальные надписи
procedure ThiGlobalVarEx._var_Var;
var dt:TData;
begin
dtNull(_Data);
dt:= ReadData(_Data,_data_Data,nil);
if (GData <> nil) and (not _IsNull(GData^)) then
_Data := GData^
else if not _IsNull(dt) then
_Data := dt
else
dtNull(_Data);
end;
карма: 9

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#3: 2006-10-15 12:26:01 ЛС | профиль | цитата
Galkov, все это было нужно для занесения переменной через данные, но, похоже, я перемудрил. Спасибо, исправил, вот так пойдет:
procedure ThiGlobalVarEx._var_Var;
begin
if (GData <> nil) then
if (not _IsNull(GData^)) then
_Data := GData^
else
begin
GData^ := ReadData(_Data,_data_Data,nil);
_Data := GData^
end
else dtNull(_Data);
end;
Проверил, вроде работает. Исправление выложил в Upload и добавил пример.

[size=-2]------ Добавлено в 12:26
Исправленная версия GlobalVarEx.
карма: 22

0
файлы: 2code_426.txt [627B] [786], _GlobalVarEx.zip [2.9KB] [619]
Ответов: 9906
Рейтинг: 351
#4: 2006-10-15 14:16:46 ЛС | профиль | цитата
А все равно как-то странно...
По результату - опциональное св-во переключения места чтения данных. Влепил NULL, и данные пошли сверху...
Может и полезно, но причем здесь Global ИМХО

[size=-2]------ Добавлено в 14:14
И такое:
procedure THIGlobalVar.SetData;
begin
if not _IsNull(Data) then
_work_doValue(Data,0);
end;
Начинает выглядеть сомнительно, при вызове внешних событий из doValue....
Работает конечно, но эта работоспособность определяется особенностями кодогенерации.
Т.е., не локализована внутри элемента - а это не очень хорошо...

[size=-2]------ Добавлено в 14:16
И вообще, странно ведет себя элемент (безотносительно к Ex), когда doName меняет свое непустое имя на уже существующее
карма: 9

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#5: 2006-10-15 15:03:15 ЛС | профиль | цитата
Galkov, а вот это не я придумал, а Dilma.
procedure THIGlobalVar.SetData;
begin
if not _IsNull(Data) then
_work_doValue(Data,0);
end;
И вообще, странно ведет себя элемент (безотносительно к Ex), когда doName меняет свое непустое имя на уже существующее
А пример, можно, разберем и попробуем улучшить.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#6: 2006-10-15 15:47:31 ЛС | профиль | цитата
nesco писал(а):
а вот это не я придумал, а Dilma
Неправда.
У Dilma метод doValue не вызывал внешних событий.


nesco писал(а):
А пример, можно, разберем и попробуем улучшить
Все сказано дословно, вроде: когда doName меняет свое непустое имя на уже существующее
Кнопочку хоть занажимайся: code_429

Да и мелкие доработки здесь не пройдут...
Если уничтожать "повторы" в NList, то надо уничтожать динамические данные. А счетчиков ссылок эти данные не имеют
карма: 9

0
файлы: 1code_429.txt [777B] [729]
Разработчик
Ответов: 26149
Рейтинг: 2127
#7: 2006-10-16 00:57:16 ЛС | профиль | цитата
Galkov, извини, я просто не понял к чему ты привел код. Да, действительно, интересно. SetData вызывается в самом начале при определении свойства и выставляет на выход NULL -- это не хорошо, да и не нужно. Будем убирать.

[size=-2]------ Добавлено в 00:57
Я подробнее разобрался с примером и заметил, что пример некорректно построен, но это не важно. Я переделал пример, а затем разобрался с кодом, вот проверь: code_435
А вот пример:
Add(MainForm,10741152,21,105)
{
Left=20
Top=105
Width=177
Height=131
Position=1
}
Add(Button,20380,189,189)
{
Left=25
Top=45
Width=120
Caption="Изменяю 333 на 222"
Data=String(Изменяю 333 на 222)
link(onClick,7228754:doEvent1,[])
}
Add(GlobalVar,1967620,406,147)
{
Name="222"
Data=Real(22.22)
Point(doName)
}
Add(GlobalVar,13903320,406,182)
{
Name="333"
Data=String(333)
Point(doName)
}
Add(Label,11904068,21,56)
{
Left=50
Top=5
Width=61
Height=17
Caption="222 = 22.22"
}
Add(Label,10049459,406,266)
{
Left=50
Top=70
Width=61
Height=17
Caption=""
AutoSize=1
Alignment=2
link(Text,13903320:Var,[])
}
Add(Timer,8038524,189,266)
{
link(onTimer,10890006:doWork2,[(371,272)])
}
Add(Hub,7228754,245,189)
{
OutCount=3
link(onEvent1,8137749:doData,[])
link(onEvent2,10890006:doWork1,[(375,202)])
}
Add(DoData,8137749,301,189)
{
Data=String(222)
link(onEventData,13903320:doName,[(369,195)(369,195)])
}
Add(HubEx,10890006,371,259)
{
link(onEvent,10049459:doText,[])
}
Add(Label,1245301,21,168)
{
Left=50
Top=25
Width=52
Height=17
Caption="333 = 333"
}
карма: 22

0
файлы: 1code_435.txt [620B] [759]
Ответов: 9906
Рейтинг: 351
#8: 2006-10-16 09:07:49 ЛС | профиль | цитата
Если я все правильно понял, то смысл твоего предложения (после выкидывания лишнего) таков:
procedure THIGlobalVar._work_doName;
var nName:string;
begin
nName := LowerCase(ToString(_Data));
if nName<>'' then GData := ForceGVar(nName);
end;

И фиг с ним со старым именем - пусть себе продолжает лежать в NList вместе с динамическими данными на которые ссылается .....

Редактировалось 1 раз(а), последний 2016-11-23 01:17:56
карма: 9

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#9: 2006-10-16 09:50:46 ЛС | профиль | цитата
Galkov, лихо ты его.. Но в моем исправлении имя в листе меняется на новое, а в твоем добавляется и старое сохраняется. Пес его знает, что лучше -- хранить старое имя, или заменять его на новое. Какие будут предложения по этому поводу.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#10: 2006-10-16 11:53:22 ЛС | профиль | цитата
Увидел уже.
А отсюда еще более смешные предложения по этому поводу: нафиг нам не нужно (оказывается ) поле FName в элементе

Примерно так: hiGlobalVar.rar
Точки любимые сам добавишь - я идею изложил

[size=-2]------ Добавлено в 11:53
P.S. являюсь апологетом принципа: лучшее средство от перхоти - гильотина
заметно, наверное...
карма: 9

0
файлы: 1hiGlobalVar.rar [755B] [494]
Разработчик
Ответов: 26149
Рейтинг: 2127
#11: 2006-10-16 12:08:50 ЛС | профиль | цитата
Galkov, логично, и самое главное, просто. Убирание поля FName давно напрвшивалось.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#12: 2006-10-16 12:33:50 ЛС | профиль | цитата
Собственно, не очень понятно, зачем сегодня и Find в interface
Я бы выкинул (unit hiGlobalVar включается только элементом hiGVarContainer и не использует Find) его, и сделал так:
function ForceGVar(const sName:string):PData;
var i:integer;Name:string;
begin
Result := nil;
if sName='' then exit;
Name := LowerCase(sName);
i := NList.IndexOf(Name);
if i>=0 then
Result := PData(NList.Objects[i])
else begin
new(Result);
dtNull(Result^);
NList.AddObject(Name,cardinal(Result));
end;
end;

Редактировалось 6 раз(а), последний 2016-11-23 01:23:14
карма: 9

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#13: 2006-10-16 12:49:14 ЛС | профиль | цитата
Galkov, понятно, что весь поиск повесили на NList.IndexOf(Name), и действительно, зачем тогда Find
карма: 22

0
Ответов: 9906
Рейтинг: 351
#14: 2006-10-16 12:56:49 ЛС | профиль | цитата
Не получается закончить тему
После того, как LowerCase попал в ForceGVar, можно упрощать совсем до безобразия
procedure THIGlobalVar.SetName;
begin
GData := ForceGVar(Value);
end;

procedure THIGlobalVar._work_doName;
begin
GData := ForceGVar(ToString(_Data));
end;
При этом правда меняется функциональность: установка пустого имени раньше не делала НИЧЕГО, а теперь стало бы - как при инициализации (очень жесткий NULL).
Но кто сказал, что так не правильно
карма: 9

0
Ответов: 262
Рейтинг: 6
#15: 2006-10-16 13:02:40 ЛС | профиль | цитата
А почему бы
    Name := LowerCase(sName);
    i := NList.IndexOf(Name);
не заменить на
    i := NList.IndexOf_NoCase(Name);
?
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)