Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Embarcadero RAD Studio XE5-XE8,10.x(Seattle, Berl

Автор: Alexey_Gawrilow
Дата сообщения: 03.02.2015 02:17
AlekXL

Цитата:
перекрыть QueryInterface


Цитата:
Если уж перекрывать, то сразу в корневом классе


Я использую на полную катушку в качестве ServiceLocator.
У меня ГлавнаяФорма, ГлавныйМодуль могут вообще не знать о интерфейсе ничего.
И тем не менее его реализовать.. не сами конечно.
Если модуль(dcu) затесался в uses, или подгружен динамически(dll)...

И получится, как у Миши Гавриленко, форма есть, но найти он ее не может
чесно слово, я не специально
Ты видишь суслика? И я нет, а он есть!
Автор: AlekXL
Дата сообщения: 03.02.2015 03:44
Alexey_Gawrilow


Цитата:
Я использую на полную катушку в качестве ServiceLocator.
У меня ГлавнаяФорма, ГлавныйМодуль могут вообще не знать о интерфейсе ничего.
И тем не менее его реализовать.. не сами конечно.
Если модуль(dcu) затесался в uses, или подгружен динамически(dll)...


я тоже к подобному пришел, когда у меня появились проблемы с unit circular reference.

Сначала решил проблему, разбив основные модули на несколько штук, но выходило, что компилятор по 5 раз пытался скомпилить юнит один, проходя по списку uses в Interface и Implementation.

Потом заинтерфейсил, скрепя сердце, основные классы, и дошел до ServiceLocator. Другое дело, что в современной Delphi , фреймворк Spring4Delphi ужасно толстый. А вот под 2007 есть оказывается фреймворк DDioc, который делает то же, и утизилизует $METHODINFO на всю катушку.
Там есть свой инвокер-- генератор бинарного кода, который может вызвать , вероятно, любой метод, с параметрами по его сигнатуре. После незначительного допила, удается вызывать конструктор с параметрами наперед неизвестного класса с реализацией нужного интерфейса. Все это -- под классическими D2007.

$METHODINFO+DDioc также открывает интересные возможности по экспорту классов в dws2(оригинальный dws2 с sf.net). Раньше я с automated RTTI страдал.

Но я не совсем понимаю, зачем классу реализовывать неявно интерфейс, если самому классу даже контракт неизвестен? Чтобы главный интерфейс(у меня это IEngine) можно было привести к любому аспекту функционала?
У меня просто есть юнит InterfaceServices, в котором есть singleton сервис локатора.
Автор: Eternal_Shield
Дата сообщения: 03.02.2015 08:40

Цитата:
не работает, вылетает Interface not supported

Проверил, всё отлично работает под ХЕ7. Какой будет класс-имплементатор не важно: <instance> as <intf> будет отрабатывать. Либо вы чего-то не договариваете/неправильно описываете.
Автор: xpin2013
Дата сообщения: 03.02.2015 12:53
Eternal_Shield

Цитата:
Проверил, всё отлично работает под ХЕ7.

Проверил - не работает. И не должно работать. Интерфейс - это всего лишь табличка с адресами методов, как VMT, но которую можно пронумеровать гуидом.
>IDerived=interface(IBase)
говорит только о том, что в этой табличке должны быть реализованы все методы IBase.
>TmyClass=class(TInterfacedObject, IBase, IDerived)
говорит что QueryInterface может по номеру/гуиду отдать IBase и IDerived. Оператор
>obj_base := obj as IBase;
вызывает виртуальный метод QueryInterface который не может найти IBase.


Цитата:
вы чего-то не договариваете/неправильно описываете.

[more=Добуквенно]
Код: type
IBase=interface
['{664547B3-F4CD-4BCD-B742-687D69204B73}']
procedure proc1;
end;
IDerived=interface(IBase)
['{B6D69E3D-40B3-4945-B20B-7B9DF8B71D91}']
procedure proc2;
end;

TmyClass=class(TInterfacedObject, {IBase,} IDerived)
public
procedure proc1;
procedure proc2;
end;

procedure TmyClass.proc1;
begin ShowMessage('proc1');
end;

procedure TmyClass.proc2;
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var
obj: TMyClass;
obj_base: IBase;
begin
obj := TMyClass.Create;
obj_base := obj as IBase;
obj_base.proc1;
end;[no][/no]
Автор: Eternal_Shield
Дата сообщения: 03.02.2015 14:24
AlekXL
xpin2013
Да, всё верно. Не работает. Это мой косяк. В консольном приложении без модуля System.SysUtils приложение якобы нормально "отрабатывает", а на самом деле эксепшон.

Надо было не чистить юнит, эх.


Цитата:
Да заметил, а при чём сдесь имплементатор?

TMyClass - что это, если не имплементатор?! Хорошо, тогда используем слово "реализатор". Раз уже мы у него берём таблицу интерфейсов, то он прямой участник ... а как там реализовано наследование интерфейсов под капотом (массивом [в Delphi] или списком [C#]) - это уже не важно. Главное как работать с этой реализацией.
Автор: Alexey_Gawrilow
Дата сообщения: 03.02.2015 14:40
AlekXL xpin2013
Eternal_Shield
Добуквенно
Где-то я это уже видел..

http://rsdn.ru/article/delphi/delphi_7_06.xml

Цитата:

Однако, если класс реализует производный интерфейс, то это совсем не означает, что он совместим с базовым интерфейсом (см. рисунок 6.4):
Для совместимости с базовым интерфейсом нужно реализовать этот интерфейс явно:
Теперь класс TExtendedTextReader совместим и с интерфейсом ITextReader, поэтому следующее присваивание корректно:
Исключением из только что описанного правила является совместимость всех снабженных интерфейсами объектов с интерфейсом IInterface:


Пробуйте через получение IInterface(IUnknown) сначала.
Дома Delphi нет/



Добавлено:
не могу найти более заслуживающий домверия источник.
Автор: Eternal_Shield
Дата сообщения: 03.02.2015 14:41
xpin2013

Цитата:
Добуквенно

Поскольку таблица реализована массивом, то хардкаст работает:
Код: obj_base := IBase(obj as IDerived);
Автор: xpin2013
Дата сообщения: 03.02.2015 14:45

Цитата:
это уже не важно. Главное как работать с этой реализацией.

В общем то не важно. Просто для меня имплементация и есть уточнение в этом не важном, что речь идёт не о "множественном наследовании Си", а о способе достижения того же самого, что и множественное наследование. В нашем случае ничего множественного.

Eternal_Shield
All

Цитата:
Вываливается окно в определённый момент, которое не может там вываливаться.


Цитата:
На всём промежутке кода - самое подозрительное Application.ProccessMessages.

Хотелось бы по этому поводу информации, так как я даже гуглил, но может запрос составляю не удачно "ошибка двойное нажатие Delphi". Трудно найти.
Автор: Eternal_Shield
Дата сообщения: 03.02.2015 14:52
xpin2013

Цитата:
Хотелось бы по этому поводу информации, так как я даже гуглил, но может запрос составляю не удачно "ошибка двойное нажатие Delphi". Трудно найти.

А что происходит то? двойной вызов TAction что ли?
Автор: Mic777
Дата сообщения: 03.02.2015 15:03
xpin2013
Из вопроса не совсем понятно сочетание этих факторов:
"Не знаю, связано ли с XE7 или с очередными обновами винды...
...Только благодаря терпению клиента удалось выцарапать логи...
...Ранее, за предыдущие мои 3 года с данным ПО, никто не жаловался..."

то ли Вы скомпиляли свою программу под XE7 и установили одному клиенту, то ли он обновил винду...

если из-за XE7 - то по идее и у Вас это должно "стрелять" - тогда дебаг в помощь,
а без исходников как-то трудно представить что происходит - соответственно и подсказать
Автор: xpin2013
Дата сообщения: 03.02.2015 15:43

Цитата:
а без исходников как-то трудно представить что происходит


Цитата:
А что происходит то? двойной вызов TAction что ли?

Да происходит двойной вызов TAction
[more=Происходит то, что я и пишу]
Код: [no]
//Собственно акция.
procedure TfmMain.actActionExecute(Sender: TObject);
begin
DoAction(False); //<--Уйма неразрывно связанных действий
fmMain.OnKeyPress := fmMain.FormKeyPress;

WriteXLog(ID);

CompareSum; //<-- Диалоговое окно предупреждения - единственный
//вызов процедуры в программе.
end;

//Примерное содержание
procedure TfmMain.CompareSum;
var
Error: Boolean;
begin
// if InActionMode then Exit; <--Этого нет тут, что кто-то раньше писал для DoAction
...
Error := (Abs(sum1 - sum2) > 0);
if Error then
MsgDlg(mzWarning, 'ВНИМАНИЕ!!!',
mtWarning, mbsOk, mnsOk);
end;

//Не воспроизвожу всех вложенных действий
procedure TfmMain.DoAction;
begin
if InActionMode then Exit; // <--Кто-то раньше писал
InActionMode := True;
...
Log('1.0');
Do1; //<-- работа с суммами
Log('1.1'); // Лог До нажатия на OK сообщения

Application.ProcessMessages; // Тут вылетает окно сообщения
...

Log('2.0'); // Лог После нажатия на ОК сообщения
Do2; //<-- работа с суммами
Log('2.1');
end;[/no]
Автор: Eternal_Shield
Дата сообщения: 03.02.2015 19:00
xpin2013

Цитата:
Происходит то, что я и пишу

Жесть какая-то. Похожу шорткат уходит в TAction, а потом, через ProcessMessages, в какой-то другой обработчик типа OnKeyDown/Up;
Что это делает: fmMain.OnKeyPress := fmMain.FormKeyPress; в TAction?
Автор: xpin2013
Дата сообщения: 03.02.2015 21:47

Цитата:
Что это делает: fmMain.OnKeyPress := fmMain.FormKeyPress; в TAction?

Это всякие глупости для гридин dxGrid (старинный DevExpress). Типа замена запятой на точку.

Добавлено:

Цитата:
Похожу шорткат уходит в TAction, а потом, через ProcessMessages, в какой-то другой обработчик типа OnKeyDown/Up;

Ну у TAction первый проход идёт по контролам окна и заканчивается выходом в Classes.StdWndProc, второй проход по акциям начинается с Application, так, что я даже не берусь предположить, как акция вызывается второй раз (и особенно почему второй раз, мне думается что в винде опять что-то меняется).
Автор: krapotkin
Дата сообщения: 03.02.2015 22:45
как и говорилось мильен раз, нельзя использовать ProcessMessages в обработчиках этих самых messages
я обрабатываю событие, но из очереди его еще не убрал
и вызываю обработку событий еще раз
что должно произойти??
Автор: Mic777
Дата сообщения: 04.02.2015 09:17
xpin2013
Судя по коду ProcessMessages используется для "оживления" прогресса выполнения.
Может тогда его заменить на методы Update, Refresh или чего там еще есть... Invalidate
для соответствующего контрола.
Хотя правильней, если это долгий процесс смотреть в сторону отдельного потока, имхо.
Автор: xpin2013
Дата сообщения: 04.02.2015 10:50
krapotkin
Mic777
Спасибо.

Цитата:
но из очереди его еще не убрал

Об этом может судить только Windows, когда я ей отдам запись Msg.Result=0/1, пока не отдам 0, не получу повторно. У программы "нет очереди" - эту очередь для программы хранит Windows и удаляет сообщения из своей логики. Разные wm_KeyUp/KeyDown/KeyRepeat могут прилететь не последовательно.

Цитата:
нельзя использовать ProcessMessages в обработчиках этих самых messages

Известная истина. Но сам знаю, что при работе с дровами девайса, когда ничего не помогает кроме sleep(200) или ProccessMessages, при том что уже sleep(300) не помогает. Плюясь и перекрещиваясь пишу ProccessMessages - нехай хоть как то девайс работает. А если написано не мной, а девайса вообще нет и дрова не известны, то трогать PM не рискну.


Цитата:
Судя по коду ProcessMessages используется для "оживления" прогресса выполнения.

Точно нет. Абсолютно. Это, насколько я понимаю, единственное что помогло при интеграции OLE/COM+ объекта драйвера. Никакого цикла для "оживления", и вызов конкретно после работы с устройством.


Цитата:
Хотя правильней, если это долгий процесс смотреть в сторону отдельного потока, имхо.

Это вообще не процесс, это "затычка" от которой не отказаться. Затычку плохо реализовали - флаг поставили внутри DoAction, но не на actActionExecute. Так бы CompareSum тоже был бы прикрыт затычкой. Тотальнее надо было решать.

ps.
По ответам выяснил, что ситуация всё же не является распространённой/известной/знакомой. Хотя krapotkin не убедил), но я полностью согласен - если можно без ProcessMessages, лучше потратить час, но избавиться, чем потом ловить глюки.
Автор: dred2k
Дата сообщения: 04.02.2015 11:02
xpin2013
Коли так все непросто, напрашивается вариант просто "обернуть" содержимое ActionExecute установкой Action.Enabled := False/True (через блок try...finally, разумеется) и оставить все как есть. Разве не поможет ?
Автор: xpin2013
Дата сообщения: 04.02.2015 11:18
dred2k
Практически то же самое и сделал. Тот же try finally, только не хочется моргать состоянием кнопки - то есть без Enabled, через свой флаг boolean. Должно помочь - вызовов CompareSum просто нет ни под каким соусом.
Автор: V1s1ter
Дата сообщения: 04.02.2015 12:18
xpin2013

Цитата:
нельзя использовать ProcessMessages в обработчиках этих самых messages

Не совсем верное утверждение. Вызов ProcessMessages из обработчика события всеголишь приведет к ПРОДОЛЖЕНИЮ обработки очереди событий по ее окончания. Тут только один момент, нужно предусмотреть что бы не образовался заменутый цикл. К стати его легко избежать заключив вызов ProcessMessages а скобки типа

Код:
if not IsWorking then begin
IsWorking := true;
...
ProcessMessages
...
IsWorking := false;
end;
Автор: xpin2013
Дата сообщения: 04.02.2015 13:36
V1s1ter

Цитата:
К стати его легко избежать заключив вызов ProcessMessages а скобки типа

Нету у нас этого. Мы вообще так далеко не плаваем. Из моего кода видно, что ProccessMessages вообще изолирован со всей кучей обработок.

Цитата:
Не совсем верное утверждение.

В нашем случае как раз верное. - Идёт борьба с привидениями.

Цитата:
но требуют ясного понимания цепочек обработки комманд/событий и внимательности.

Мы вообще так далеко не плаваем (с). Нам требуется изолировать существование акции на момент вызова ProccessMessages. Кстати прокатывает даже ShortKey := 0.
Автор: vengr
Дата сообщения: 11.02.2015 00:48
TeeChart.Pro.VCL.v2015.14.150120.FS не компиллится на хе7u1 (студия на виртуальной W7 32)

Цитата:
TeeImport921
Cannot recompile Delphi package: TeeImport921.dpk
Embarcadero Delphi for Win32 compiler version 28.0
Copyright (c) 1983,2014 Embarcadero Technologies, Inc.
VCLTee.TeeImport.pas(136) Fatal: E2213 Bad packaged unit
format: C:\Program Files\Embarcadero\Studio\15.0\Lib\win32\Release\bindcomp.dcp.Data.Bind.JSON -
Expected version: 28.0, Windows Unicode(x86) Found version: 0.0, Windows Ansi(x86)
EXCEPTION:
Compilation aborted.


как побороть?
Автор: V1s1ter
Дата сообщения: 12.02.2015 23:19
vengr
Я не знаю как побороль, так как у меня такой проблемы не возникало.
Я компилирую батниками, могу сбросить свой вариант, но настройку сами будете делать.
И, да, я поудалял префексы Teevcl, а для FMX не компилировал и вырезал воообще.
Выложить?
Автор: vengr
Дата сообщения: 12.02.2015 23:35
V1s1ter

Цитата:
Выложить?

Выложить, заранее 10х!
подозреваю, что тут чтото связано с виртуальностьюй Win7...
Автор: V1s1ter
Дата сообщения: 13.02.2015 00:29
vengr
Смотри личку.
Автор: ivan76
Дата сообщения: 17.02.2015 20:55
Использую DataSnap (Delphi XE6) тип TDSServer.

На серверной части AdoConnect и AdoQuery;

Клиентская часть TSQLConnection

Собственно все работает, клиент получает выборку данных с сервера, но возникла ситуация с передачей файла с клиента, на сервер.

Не могу сообразить как сделать, подскажите.

Гугл в основном показывает обратную ситуацию, передачу с сервера на клиент.

Добавлено:
Вопрос решен.
Автор: Alexey_Gawrilow
Дата сообщения: 18.02.2015 22:10
SuPriTo
asutp2
обновление к http://forum.ru-board.com/topic.cgi?forum=33&topic=13825&start=1700#7

VerySimple.Lua 2.0 – a cross-platform Lua 5.3.0 wrapper for Delphi XE5-XE7
http://blog.spreendigital.de/2015/02/18/verysimple-lua-2-0-a-cross-platform-lua-5-3-0-wrapper-for-delphi-xe5-xe7/
http://code.google.com/p/verysimplelua/

Автор: xpin2013
Дата сообщения: 18.02.2015 22:24
У меня вопрос, суть которого проще понять после моего, возможно корявого пояснения (на случай поспорить - я пас, пояснение оно только для вопроса).

Простите новичка, недавно столкнулся с необходимостью узнать, что такое MVC (Model View Controller), в руках исходники с MVC. Я под впечатлениями, как от исходников, так и от того что в интернете бросилось в глаза.
1) Модель - обёртка данных. Смысл её существования в обеспечении отдельного развития модели от конечных реализаций. Неоднократно делаются замечания, что хороший тон, это когда бизнес-логика закладывается в модели. Ну это понять просто, например, - бизнес-логика в триггерах, а никак не в событиях датасета. Зачем же Модель, то есть обёртки? Использование модели уже отменяет технологию DB->DataSet->DBControl и обязывает продублировать работу с данными - данные изменяются и в модели и в файле DB. Оказывается Controller умеет строить модель независимо, - либо он читает данные из датасета/базы и заполняет коллекцию/список, либо строит её не связанно с базами, - на момент существования процесса или задачи. Остальной код не знает как заполнять обёртки и использует для этого контроллер. (сомневаюсь, что ради этого можно согласиться на дублирование данных, когда нам не хочется использовать ClientDataSet мы его не используем).
2) View - представление. Тут понятно, если мы добавили поле в модель, мы его добавляем в гридину, всё так же как обычно за исключением - это не DBControl, нет датасетов/датасурсов. Мы из обёрток вытаскиваем строки и передаём их в грид. Если не ошибаюсь в сишарпе это метод Fill тоже какого-то контроллера, но вызывает его именно представление. Почему View мы связываем с моделью, а не с датасетом? Чем можно заменить технологию событий протекающих через DataSource? Ну есть пассивный MVC - обёртки есть, событий их изменений нет. Есть активный, в классическом варианте MVC - это активный MVC. В этом случае View подписывается на события модели, у меня десяток View - 5 подписалось на события одного справочника, а 5 подписалось на события другого. Там в сишарпе событие это не один обработчик OnChanged, а сколько угодно все происходят пачкой последовательно. В шарпе это реализовано на уровне языка и понятно, почему можно согласиться на MVC, для чего пассивная модель может быть использована в Delphi совершенно теряюсь, для активной модели приведу свой суррогат/заменитель
[more]
Код: [no]type
TEventList = class(TComponent)
private
FList: array of TMethod;
FLock: TRTLCriticalSection;
FUnpackList: array of TMethod;
procedure Delete(Index: Integer);
function IndexOf(const AEvent: TMethod): Integer;
protected
function AddEvent(const AEvent: TMethod): Integer;
function Count: Integer;
function Event(Index: Integer): TMethod;
function IsEmpty(Index: Integer): Boolean;
procedure LockList;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure RemoveEvent(const AEvent: TMethod);
procedure RemoveEventOf(AComponent: TObject);
procedure UnlockList;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

TNotifyEventList = class(TEventList)
public
procedure Add(AEvent: TNotifyEvent);
procedure Execute(Sender: TObject);
procedure Remove(AEvent: TNotifyEvent);
end;

{ TEventList }

function TEventList.AddEvent(const AEvent: TMethod): Integer;
var
L: Integer;
begin
if (AEvent.Code = nil) and (AEvent.Data = nil) then
raise EListError.Create('Invalid method value');
EnterCriticalSection(FLock);
try
Result := IndexOf(AEvent);
if Result < 0 then
begin
L := Length(FList);
SetLength(FList, Succ(L));
FList[L] := AEvent;
if TObject(AEvent.Data) is TComponent then
TComponent(AEvent.Data).FreeNotification(Self);
end;
finally
LeaveCriticalSection(FLock);
end;
end;

function TEventList.Count: Integer;
begin
Result := Length(FUnpackList);
end;

constructor TEventList.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
InitializeCriticalSection(FLock);
end;

procedure TEventList.Delete(Index: Integer);
var
I: Integer;
M: TMethod;
begin
I := Length(FList);
if (Index < 0) and (Index >= I) then
raise EListError.CreateFmt('List index out of bounds (%d)', [Index]);
Dec(I);
M := FList[Index];
if Index < I then
System.Move(FList[Index + 1], FList[Index],
(I - Index) * SizeOf(TMethod));
SetLength(FList, I);
for I := 0 to High(FUnpackList) do
if (FUnpackList[I].Code = M.Code) and (FUnpackList[I].Data = M.Data) then
begin
FUnpackList[I].Code := nil;
FUnpackList[I].Data := nil;
Exit;
end;
end;

destructor TEventList.Destroy;
begin
SetLength(FList, 0);
DeleteCriticalSection(FLock);
inherited Destroy;
end;

function TEventList.Event(Index: Integer): TMethod;
begin
if (Index < 0) or (Index >= Length(FUnpackList)) then
FillChar(Result, Sizeof(Result), 0)
else
Result := FUnpackList[Index];
end;

function TEventList.IndexOf(const AEvent: TMethod): Integer;
var
I: Integer;
begin
Result := -1;
for I := Pred(Length(FList)) downto 0 do
if (FList[I].Code = AEvent.Code) and (FList[I].Data = AEvent.Data) then
begin
Result := I;
Exit;
end;
end;

function TEventList.IsEmpty(Index: Integer): Boolean;
begin
if (Index < 0) and (Index >= Length(FUnpackList)) then
raise EListError.CreateFmt('List index out of bounds (%d)', [Index]);
Result := (FUnpackList[Index].Code = nil) and
(FUnpackList[Index].Data = nil);
end;

procedure TEventList.LockList;
var
L: Integer;
begin
EnterCriticalSection(FLock);
L := Length(FList);
SetLength(FUnpackList, L);
System.Move(FList[0], FUnpackList[0], L * SizeOf(TMethod));
end;

procedure TEventList.Notification(AComponent: TComponent;
Operation: TOperation);
begin
if Operation = opRemove then
RemoveEventOf(AComponent);
inherited Notification(AComponent, Operation);
end;

procedure TEventList.RemoveEvent(const AEvent: TMethod);
var
I: Integer;
begin
EnterCriticalSection(FLock);
try
for I := Pred(Length(FList)) downto 0 do
if (FList[I].Code = AEvent.Code ) and (FList[I].Data = AEvent.Data) then
begin
Delete(I);
Break;
end;
finally
LeaveCriticalSection(FLock);
end;
end;

procedure TEventList.RemoveEventOf(AComponent: TObject);
var
I: Integer;
begin
EnterCriticalSection(FLock);
try
for I := Pred(Length(FList)) downto 0 do
if FList[I].Data = AComponent then
Delete(I);
finally
LeaveCriticalSection(FLock);
end;
end;

procedure TEventList.UnlockList;
begin
SetLength(FUnpackList, 0);
LeaveCriticalSection(FLock);
end;

{ TNotifyEventList }

procedure TNotifyEventList.Add(AEvent: TNotifyEvent);
begin
AddEvent(TMethod(AEvent));
end;

procedure TNotifyEventList.Execute(Sender: TObject);
var
I: Integer;
begin
LockList;
try
for I := 0 to Count - 1 do if not IsEmpty(I) then
TNotifyEvent(Event(I))(Sender);
finally
UnlockList;
end;
end;

procedure TNotifyEventList.Remove(AEvent: TNotifyEvent);
begin
RemoveEvent(TMethod(AEvent));
end;[/no]
Автор: dix75
Дата сообщения: 19.02.2015 11:19
Подскажите как безболезненно перейти с RAD 2007 на xe7

Ранее года 4 назад пытылся с RAD2007 на RAD2009 не вышло возникли проблемы со строками.
Автор: Mic777
Дата сообщения: 19.02.2015 11:27
dix75
Стесняюсь спросить, а каких собственно заболеваний боитесь?
И что собственно страшного со строками, юникод?
По идее главное чтобы сторонние компоненты "перешли" на ту версию, которая вас интересует.
Остальное в ваших руках, имхо.
Автор: dix75
Дата сообщения: 19.02.2015 11:38
Mic777
Ну на 2007 у меня лицензия была ( в смысле есть)

Проект большой и все было на ANSI.
Может быть еще какие-нить подводные камни есть

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129

Предыдущая тема: Отмена встречи в Outlook из Excel VBA


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.