Отправляет email-рассылки с помощью сервиса Sendsay

Delphi - проблемы и решения

  Все выпуски  

Проблемы и решения в Delphi #30


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Проблемы и решения в Delphi - выпуск 30 от 20.09.2001.


Зима наступила
грачи улетели...


ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС


Доброго Вам времени суток уважаемый читатель.

А у нас первый снег выпал... и растаял...

Продолжаю принимать Ваши предложения по организации OFFLine
архива исходников и процедур.

Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Очередные вопросы.
2. Отвеченные вопросы.
~~~~~~~~~~~~~~~~~~~



1. Очередные вопросы.
---------------------


Вопрос 471:

От: Dm

Подскажите, почему не запускается пример
c dbExpress - 'dbExpress Explorer' из
6-й делфи - '..Delphi6\Demos\Db\DbxExplorer\.. '.
Точнее он запускается, но при открытиии чего - либо
пишет, что нет каких то библиотек?
Где их взять?


Ответить.

Ответ 1:


Вопрос 472:

От: vas

Как программно проверить соответствие индекса базе данных Paradox ?


Ответить.

Ответ 1:


Вопрос 473:

От: DEKurdjukov@sng.tnk.ru

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


Ответить.

Ответ 1:


Вопрос 474:

От: Nikolay

Доброго времени суток!
У меня такой вопрос-как можно работать с файлами в локальной сети-поиск,
копирование т.п.



Ответить.

Ответ 1:


Вопрос 475:

От: Alexandr

1) При инсталляции собственного компонента Delphi 5 требует одноименный
компонент
bpl-файл. Как мне его создать?

2) У меня Win 98. После компиляции программы на своем компьютере, на
95-том
Windows не прорисовываются картинки на TToolBar. Вы не можете
подсказать,
что этому TToolBar'у не хватает в Win 95?


Ответить.

Ответ 1:


Вопрос 476:

От: Алексей Малиновский


Всё таки никак не могу разобраться с Interbase.
Сделал сетевую программу складского учёта с использованием Interbase.
1. Настройка компьютера, считающегося сервером.
Устанавливаю на одну машину (имя компьютера SERV, сервер) InterBase
Server и Client, запускаю ibServer.exe, запускаю программу (в пути базы
данных прописываю путь БД: Database.DatabaseaName:="C:\program
files\m-a-b\склад\data\sklad.gdb") - программа работает!
2. Настройка компьютера клиента.
Устанавливаю на другую машину (которая в находится сети и видит машину
сервер под именем SERV) InterBase Client, прописываю БД с помощью
ibconsole.exe - связь с БД есть. Запускаю ibguard.exe. Запускаю свою
программу, и в пути БД прописываю:
Database.DatabaseaName="SERV:C:\program
files\m-a-b\склад\data\sklad.gdb" - выдаётся ошибка соединенения с
сервером!

Подскажите что делать, в каком хоть направлении продолжать
исследования???



Ответить.

Ответ 1:


Вопрос 477:

От: Stark


    Есть локальная сеть. Есть Delphi 5. Нужно
    написать программу которая сканировала бродкаст (***.*.*.255)
    на наличие определенных пакетов на определенных портах и
    считала их количество.
    Насколько, я понимаю клиент-серверные компоненты здесь
    неуместны. Возможно подорйдет, NMUDP, но как с ним работать я
    не смог разобраться.



Ответить.

Ответ 1:


Вопрос 478:

От: Alexander


Подскажите пожалуйста - какими компонентами пользоваться (желательно с
примером) или подскажите литература, чтобы своять прогу для ведения
учета времени и удаленого управления компом по типу компьтерного зала.


Ответить.

Ответ 1:


Вопрос 479:

От: Semen

Есть вопрос. Может быть кто-то с этим сталкивался и добился
результатов. Есть задача, надо организовать проверку орфографии прямо
в компоненте редактора (как это делает Word, The Bat). Слова с
ошибками подчеркиваются, есть варианты ответов, добавление слова в
словарь.
ActiveX компонент delphi VSSpell не подходит.
Может кто какой компонент предложит.


Ответить.

Ответ 1:


Вопрос 480:

От: Mickle

Господа, подскажите самый лучший алгоритм для записи содержимого
компонента TStringGrid на диск. К сожалению, для этого компонента метод
SaveToFile не предусмотрен. Он предусмотрен только для свойства Rows, но
в этом случае кол-во файлов будет равно количеству горизонтальных рядов
в сетке. Я использовал запись через FileWrite. Может у кого есть
альтернативные варианты?


Ответить.

Ответ 1:


Вопрос 481:

От: Вадим Овчинников


Подскажите, пожалуйста, новичку, что это такое и как с этим бороться.

:Access violation at address 00403DB6 in module 'PROGA.EXE'. Read of
address
04150B24

То, что написано в хельпе меня никоим образом не "образовало" :)


Ответить.

Ответ 1:


Вопрос 482:

От: Hitman

Обратил внимание, что иногда в базе Paradox (через BDE)
исчезают записи. То есть делаю Append, инициализирую
поля, POST, запись появляется на экране (TDBGrid), не
закрывая приложения открываю соответствующий файл
DB в Far (на просмотр) - там этой записью и не пахнет
(остальные вижу). Закрываю приложение, закрываю
Delphi, открываю DB - а вот и она. Отсюда вывод -
если глюкнет приложение, Delphi (крайне редко, но бывает),
или машина - то запись потеряется. Пробовал
добавить после POST TTable.Close; TTable.Open - эффект
тот же. Вопрос, что ж это за отложенная запись такая
и как с ней бороться? Аналогичный вопрос задает и
товарищ Уханов в предыдущей рассылке.


Ответить.

Ответ 1:


Вопрос 483:

От: Алексей Малиновский


Господа, подскажите можно ли как нибудь программно в Delphi осуществить
очистку мусора в БД Interbase, а также сохранение копии и
восстановление. Если можно то как?



Ответить.

Ответ 1:


Вопрос 484:

От: DM

Я самостоятельно стал изучать Delphi.
Мне посоветовали изучать программирование на конкретных программах.

Если у кого-то есть какие-нибудь контрольные или тестовые задания,
программы, которые задавали в каких-либо учебных заведениях
(начиная с консольных приложений), и кому не лень, вышлите пожалуйста
на D_Mart76@mail.ru <mailto:D_Mart76@mail.ru>



Ответить.

Ответ 1:


Вопрос 485:

От: vas

Как проверить программно соответствие индекса БД Paradox ?
Например при зависании программы, при редактировании каой либо записи
может нарушиться соответствие индекса таблице. Так вот , как проверить
корректен ли индекс.


Ответить.

Ответ 1:



2. Отвеченные вопросы.
----------------------



Вопрос 371:

От: Evgen Fedorenko

Есть форма на котрою кинуты, к примеру, лейбл и кнопка. Есть
текстовый файл в котором есть строка типа:
MainForm.Label1.Caption=Anything.
Как сделать так, чтобы при нажатии на кнопку можно было изменить
caption лейбла на Anything (я имею в виду не текстовый парсер, а
тайпкаст строки в объект)?


Ответить.

Ответ 1:
(MainForm.findcomponent('Label1') as
TLabel).caption:='Anything';


Вопрос 372:

От: ivc_dima


Пишу я Вам, т.к. есть одна проблема. Не могли бы Вы мне помочь. Я
пытаюсь на Delphi5 создать отчет в Excel используя компоненты
TExcelApplication, TExcelWorkbook и т.д.
Фрагмент программы:


ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,0)
as _Workbook);
  ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as _Worksheet);


ExcelWorksheet1.Cells.Item[1,1].CopyFromRecordset(?,EmptyParam,EmptyPara
m);

  ExcelWorksheet1.Columns.AutoFit;
  ExcelApplication1.Visible[0]:=true;
 
 
ExcelWorkbook1.SaveAs(name,xlWorkbookNormal,Emptyparam,Emptyparam,Emptyp
aram,Emptyparam,xlNoChange,xlUserResolution,Emptyparam,Emptyparam,Emptyp
aram,0);
  ExcelApplication1.Quit

  В данном фрагменте не могу передать параметр Data:IUnknown в функции
  CopyFromRecordset(const Data:IUnknown; MaxRows:OleVariant;
MaxColumns:OleVariant)

  Не сталкивались ли Вы с этой функцией. Помогите пожалуйста
  разобраться с этой проблемой. Заранее благодарен. 


Ответить.

Ответ 1:


Вопрос 373:

От: Ivan

Какие правила нужно соблюдать при написании программы БЕЗ формы:=)
Типа: из uses нужно удалить Forms, использовать функции, а не процедуры,
and
other -- каким образом?!?!?!:=)


Ответить.

Ответ 1:
В меню создать, выбираем "Consolo aplicaion"
Ответ 2:
Пишешь код прямо в главном модуле(тот который появляется при
просмотре ViewSourse).
Ответ 3:
Убери ВСЕ юниты, а текст программы пиши в DPR-файле.
Плюс поставь признак консольности проги.


Вопрос 374:

От: Игорь Маринин

Хочу спросить Вас, как можно читать писать голос с модема.
Может можно не напрямую а как-то через TAPI или RAS библиотеки.


Ответить.

Ответ 1:


Вопрос 375:

От: Anton

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

Ответить.

Ответ 1:
var SearchRec:TSearchRec;
begin
try
if FindFirst(FileName, faAnyFile, SearchRec)=0 then
  DeleteFile(SearchRec.Name);
while FindNext(SearchRec)=0  do
   begin
   if not DeleteFile(SearchRec.Name) then;
   end;
finally
FindClose(SearchRec);
end;
end;


Вопрос 376:

От: Ivan

Какой класс имеет Рабочий стол: в WinSight32 -- #32769:Desktop; в проге
Даниила Карапетяна(WindInfo) -- SysListView32?!?!
Подскажите, как узнать его handle. FindWindow('#32769',nil) и
FindWindow('SysListView32',nil) -- НЕ РАБОТАЮТ.


Ответить.

Ответ 1:
На сколько я знаю, в Вынь32 имя ему - SysListView32.
Можно попробовать взять хендл как указатель на
child-окно от Program Manager'а:
...............................................................
function GetDesktopListView : THandle;
var S: String;
begin
 Result := FindWindow('ProgMan', nil);
 Result := GetWindow(h, GW_CHILD);
 SetLength(S, 40);
 GetClassName(Result, PChar(S), 39);
 if PChar(S) <> 'SysListView32' then Result := 0;
end;
...............................................................
Если всё-таки имя другое, то можно попробовать
обрезать последние 3 строки.
Ответ 2:
Handle Рабочего стола всегда 0.


Вопрос 377:

От: SMike

КАК ОПРЕДЕЛИТЬ ВЕРСИЮ СВОЕЙ ПРОГРАММЫ???


Ответить.

Ответ 1:
Для получения информации о версии своей программы совсем неплохо её(номер
версии) туда( в прогу) записать!
Для этого в "Project/Options/Version Info" включите "Галочку" Include......
Пример использования этой информации есть в стандартной формочке "ABOUT"
Ответ 2:
для определения версии своей программы попробуй использовать следующую
функцию, подставив в качестве FileName имя EXE файла пограммы.

{ --- GetFileVersion --- }
function GetFileVersion (const FileName: string): String;
var
 VersionSize: integer;
 Zero, FixedVersionInfoSize: Cardinal;
 buffer: Pointer;
 Code: LongBool;
 FixedVersionInfo: PVSFixedFileInfo;
begin
 Result := '';
 VersionSize := GetFileVersionInfoSize (PChar (FileName), Zero);
 if VersionSize > 0 then
 begin
  GetMem (buffer, VersionSize);
  Code := GetFileVersionInfo (PChar (FileName), Zero, VersionSize, buffer);
  if Code then
  begin
   VerQueryValue (buffer, '\', Pointer (FixedVersionInfo), FixedVersionInfoSize);
   Result := Format ('%d.%d.%d.%d',
   [FixedVersionInfo^.dwFileVersionMS div 65536, FixedVersionInfo^.dwFileVersionMS mod 65536,
    FixedVersionInfo^.dwFileVersionLS div 65536, FixedVersionInfo^.dwFileVersionLS mod 65536]);
  end;
  FreeMem (buffer, VersionSize);
 end;
end;

Ответ 3:
var
 FFileName: pchar;
 Handle: dword;
 FSize: dword;
 FVerData: pointer;
 FTranslation:ansistring;
 MajorVersion,
 MinorVersion:string;

 function GetVerValue(const Trans:boolean;const AValue: ansistring):
ansistring;
 var
  Data: pointer;
  Len: longword;
  LData: longint;
 begin
  if Windows.VerQueryValue(FVerData, pchar(AValue), Data, Len) then
   begin
   LData := longint(Data^);
   if Trans then RESULT := SysUtils.IntToHex((LData shr 16) or
word(LData) shl 16, 8)
        else RESULT := ansistring(pchar(Data));
   end
  else Result:='<no version information>'
 end;
begin
 FFileName := SysUtils.StrNew(pchar(Application.ExeName));
 FSize := Windows.GetFileVersionInfoSize(FFileName, Handle);
 FVerData:=nil;
 System.ReallocMem(FVerData, FSize);
 if (Windows.GetFileVersionInfo(FFileName, Handle, FSize, FVerData)) then
  begin
  FTranslation:=GetVerValue(true,'\VarFileInfo\Translation');
  MinorVersion:=GetVerValue(false,
'\StringFileInfo\'+FTranslation+'\FileVersion');
  MajorVersion:=Copy(MinorVersion,1,Pos('.',MinorVersion)-1);
  MinorVersion:=Copy(MinorVersion,Pos('.',MinorVersion)+1,1000);
  MinorVersion:=Copy(MinorVersion,Pos('.',MinorVersion)+1,1000);
  MinorVersion:=Copy(MinorVersion,Pos('.',MinorVersion)+1,1000);
  lblVer.Caption:=GetVerValue(false,
'\StringFileInfo\'+FTranslation+'\InternalName'{'\ProductName'})+' v
'+MajorVersion+'.'+MinorVersion;
  end;


Вопрос 378:

От: Боровиков О.А.

Как можно перекодировать сообщение (содержание) из Win в КОИ8-Р для
отправки по EMail?


Ответить.

Ответ 1:
const
 Koi: Array[0..66] of Char = ("╦", "Ё", "ё", "А", "Б", "В", "Г", "Д", "Е", "Ж",
                "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р",
                "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ",
                "Ы", "Ь", "Э", "Ю", "Я", "а", "б", "в", "г", "д",
                "е", "ж", "з", "и", "й", "к", "л", "м", "н", "о",
                "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш",
                "щ", "ъ", "ы", "ь", "э", "ю", "я");
 Win: Array[0..66] of Char = ("ё", "Ё", "╦", "ю", "а", "б", "ц", "д", "е", "ф",
                "г", "х", "и", "й", "к", "л", "м", "н", "о", "п",
                "я", "р", "с", "т", "у", "ж", "в", "ь", "ы", "з",
                "ш", "э", "щ", "ч", "ъ", "Ю", "А", "Б", "Ц", "Д",
                "Е", "Ф", "Г", "Х", "И", "Й", "К", "Л", "М", "Н",
                "О", "П", "Я", "Р", "С", "Т", "У", "Ж", "В", "Ь",
                "Ы", "З", "Ш", "Э", "Щ", "Ч", "Ъ");


function WinToKoi(Str: String): String;
var
 i, j, Index: Integer;
begin
 Result := ""

 for i := 1 to Length(Str) do
 begin
  Index := -1;
  for j := Low(Win) to High(Win) do
   if Win[j] = Str[i] then
   begin
    Index := j;
    Break;
   end;

  if Index = -1 then Result := Result + Str[i]
         else Result := Result + Koi[Index];
 end;
end;

function KoiToWin(Str: String): String;
var
 i, j, Index: Integer;
begin
 Result := ""

 for i := 1 to Length(Str) do
 begin
  Index := -1;
  for j := Low(Win) to High(Win) do
   if Koi[j] = Str[i] then
   begin
    Index := j;
    Break;
   end;

  if Index = -1 then Result := Result + Str[i]
         else Result := Result + Win[Index];
 end;
end;


procedure SendFileOnSMTP(Host: String;
             Port: Integer;
             Subject,
             FromAddress, ToAddress,
             Body,
             FileName: String);
var
 NMSMTP: TNMSMTP;
begin
 if DelSpace(ToAddress) = "" then Exit;
 if ToAddress[1] = "" then Exit;

 if (DelSpace(FileName) <> "") and not FileExists(FileName) then
  raise Exception.Create("SendFileOnSMTP: file not exist: " + FileName);

 NMSMTP := TNMSMTP.Create(nil);
 try
  NMSMTP.Host := Host;
  NMSMTP.Port := Port;
  NMSMTP.Charset := "koi8-r"
  NMSMTP.PostMessage.FromAddress := FromAddress;
  NMSMTP.PostMessage.ToAddress.Text := ToAddress;
  NMSMTP.PostMessage.Attachments.Text := FileName;
  NMSMTP.PostMessage.Subject := Subject;
  NMSMTP.PostMessage.Date := DateTimeToStr(Now);
  NMSMTP.UserID := "netmaster"
  NMSMTP.PostMessage.Body.Text := WinToKoi(Body);
  NMSMTP.FinalHeader.Clear;
  NMSMTP.TimeOut := 5000;
  NMSMTP.Connect;
  NMSMTP.SendMail;
  NMSMTP.Disconnect;
 finally
  NMSMTP.Free;
 end;
end;


Вопрос 379:

От: Ivan

Как правильно общаться с функциями типа WM_SETTEXT: в хелпе я читал, что
у этой функции есть два переметра(0 и строка), НО КАК ИМИ ВОСПОЛЬЗОВАТЬСЯ.
Если я пишу: SendMessage(myhwnd,WM_SETTEXT[0,'Нет'],0,0), то вылазиет
ошибка
'array typr required'(как же запихнуть 0 и строку в массив?)


Ответить.

Ответ 1:
WM_SETTEXT не функция а сообщение. А использовать надо так:
SendMessage(myhwnd,WM_SETTEXT,0,@LPZстрока),


Вопрос 380:

От: Danil

У меня к Вам, возможно, глупый вопрос: хочу создать свою заставку;
куда выводить графику? DrawGrid? Или ещё куда-нибудь (пооптимальнее)?


Ответить.

Ответ 1:
Проще всего на TImage, либо на TCanvas формы-заставки.


Вопрос 381:

От: Danil

Типа начал я писать свой скринсейвер и натолкнулся но проблему: как
убрать этот мышиный след aka курсор?
Полазил по хэлпам (delphi5, english), сначала написал так:

screen.cursor := null;

но не тут-то было, всё откомпилилось, но выньдос начала ругаться.
Попробовал значение 0 - стандартный курсор. Тут меня осенило -
поставил

screen.cursor := -1;

И ВОТ ОНО!!! НЕТ КУРСОРА!!!

К чему я это пишу? Хочу спросить у Вас: может есть более удобный
и оптимальный способ?


Ответить.

Ответ 1:
Можно написать так:
showcursor(false);
showcursor(true);
первое отключает курсор, а вторая процедура его включает. Попробуй.
Ответ 2:
В Делфях у формы, как у компоненты, есть свойство (по-моему CursorType
или просто Cursor) его надо поставить как none.


Вопрос 382:

От: Odincov Vadim

Подскажите, как написать код кнопок <-Назад, Вперед-> и Обновить в
WebBrowser, наподобии кнопок в Internet Explorer?


Ответить.

Ответ 1:
Почитайте описание события
TWebBrowser.OnCommandStateChange


Вопрос 383:

От: Суханов Александр Владимирович

Подскажите, пожалуйста, можно ли каким либо образом узнать Handle
программы запускаемой функцией CreateProcess.
Не псевдо Handle как у GetCurrentProcess, а истинный.


Ответить.

Ответ 1:


Вопрос 384:

От: Andrey Kochetov

 Люди добрые, помогите исходниками двух проектов (или
понятными объяснениями): как запихнуть формы в DLL, а
потом вызывать их из приложения ? Если примеры будут
на C++ Builder, границы моей благодарности будут
беспредельны; но можно и на Delphi.


Ответить.

Ответ 1:


Вопрос 385:

От: бОДТiК сВМПОУШЛЙК

У меня такая проблема:
запускаю 2 внешних програми из Delphi
WinExec(PChar('export.exe '+FileName3),SW_HIDE);
WinExec(PChar('arh '+FileName2+' *.damp'),SW_HIDE);

причем вторая должна запускатся после того как первая
завершит роботу. Как ето отследить?


Ответить.

Ответ 1:


Вопрос 386:

От: spater

В обшем пишу:
procedure TForm2.Label4Click(Sender: TObject);
begin
ShellExecute(h,'open','mailto:spater@host.kz',nil,SW_RESTORE);
end;
а Delphi выдаёт следующее:
[Error] Unit2.pas(33): Incompatible types: 'Integer' and 'PChar'
Что за ерунда,подскажите плиз.


Ответить.

Ответ 1:
Пропущен один NIL. Надо:
ShellExecute(h,'open','mailto:spater@host.kz',nil,NIL,SW_RESTORE);


Вопрос 387:

От: М/О г.Каховка


Как вызвать с помощью команды Shellexecute OutlookExpress с
заполненными полями [Кому:] и [Тема:] я знаю. А вот как еще и программно
присоединить к OutlookExpress указанный файл (вложить в письмо) в
синтаксисе Shellexecute я в FAQах не нашел. Помогите, плиз, ну
очень-очень нужно!!!


Ответить.

Ответ 1:


Вопрос 388:

От: бОДТiК сВМПОУШЛЙК

У меня такая проблема:
запускаю 2 внешних програми из Delphi
WinExec(PChar('export.exe '+FileName3),SW_HIDE);
WinExec(PChar('arh '+FileName2+' *.damp'),SW_HIDE);

причем вторая должна запускатся после того как первая
завершит роботу. Как ето отследить?


Ответить.

Ответ 1:
Варианты:
1. Правильный - через CreateProcess (F1 в Win32HLP)
2. Написать BAT-файл, в котором написать что-то типа:
   start /wait programm1.exe
   start /wait programm2.exe
3. Использовать FileExecute из библиотеки RX


Вопрос 389:

От: Ivan

Не знаю, может этот вопрос Вам покажется простым , но всё-таки: почему
при работе с TButton на моей форме я могу поменять её регион, на эллипс
например, но не могу поменять регион кнопки в винде, зная про неё
всё(регион, width, handle и т.д.).


Ответить.

Ответ 1:


Вопрос 390:

От: Гавриленко Ю.Н.

Работаю с базами Paradox. После добавления или
редактирования записей использую функцию Post. Однако все изменения в
базу вносятся только после закрытия таблиц. Поэтому если виснет
компьютер, то все пропадает. В чем проблема, как в этих таблицах
функционирует Post. Может чего делаю не правильно. При работе с DBase
все было ОК.


Ответить.

Ответ 1:
Свойство CashedUpdates, TTable, установи в False.
Ответ 2:
Проблема в кэшировании BDE.

Решение:
После каждого Post и Delete нужно принудительно сбрасывать буфер BDE
на диск :

uses BDE
.....
procedure TForm1.Table1AfterPost ;
begin
 DBISaveChanges ( Table1.Handle ) ;
end ;

procedure TForm1.Table1AfterDelete ;
begin
 DBISaveChanges ( Table1.Handle ) ;
end ;

Кроме того в установках BDE
в BDE Administrator нужно установить общий параметр
LOCAL SHARE в TRUE

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

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







Если Вы хотите как можно скорее получить ответ на свой вопрос, то
укажите в теме письма - delphiV,иначе письмо будет прочитано значительно
позже, если же у вас есть предложения то в теме письма укажите delphiP.

Для интересующихся - немного о себе. Работаю на
железнодорожном транспорте ведущим программистом.
Основные мои разработки - это сбор и доставка клиентам
информации о вагонах и поездах: где находится(по России),
куда едет. В связи с этим программировал для e-mail,Socket,БД,ISAPI.

За сим прощаюсь - скорых Вам и качественных программ.

Автор рассылки - Дмитрий.
ICQ - 89533941.

ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное