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

Программирование на Delphi

  Все выпуски  

Программирование на Delphi (выпуск 44)


Программирование на DELPHI
Выпуск #44 (24 марта 2006 г.) 

Разделы сайта:

Новости сайта
Система "Эксперт"
Вопросы и Ответы
Отправить вопрос
Файловый архив
Статьи
Компоненты
Plug-in's
Документация
Исходники
Изображения
Игры
Программы
Форум
F.A.Q.
Архив рассылки
Каталог сайтов
Обратная связь



Связь:

Администратор
Система "Эксперт"
Информация

Доброго времени суток, уважаемые читатели!

За время, прошедшее с выхода прошлого выпуска рассылки, на сайте произошли значительные изменения:
- Полностью обновлена система регистрации и управления учётными записями пользователей. Зарегистрироваться можно здесь. В скором времени появятся дополнительные функции, которые будут доступны зарегистрированным пользователям.
- На сайте изменились некоторые ссылки, поэтому, если та или иная страница не открывается по старому адресу, отыщите ссылку на неё в навигации сайта.
- Переработан и полностью функционирует раздел "Статьи". Добавлена возможность оценки статей по пятибалльной системе; также добавлена возможность оставлять комментарии для каждой из статей; добавлено несколько статей.
- Изменены страницы "Документация", "Вопросы и ответы"; в архив рассылки добавлены выпуски 31 - 40.
- Оптимизированы все страницы, теперь сайт загружается примерно на 40% быстрее.
- Исправлены мелкие ошибки.

В целом: добро пожаловать!

Есть и плохая новость... Возможно, что рассылка в следующие 2-3 месяца будет выходить достаточно редко, а может и совсем уйдёт в "отпуск". В любом случае, об этом будет сообщено заранее. Тоже самое может и случиться и с сайтом... Причина всему этому - учёба. Не за горами конец года - у кого-то экзамены, у кого-то сессии...

Вопросы и ответы для следующего выпуска рассылки принимаются до 31.03.2006 18:00. До встречи!

Опрос

Готовы ли Вы заплатить за платный компонент, чтобы использовать его в своих программах, если он выполняет все те функции, которые Вам нужны?

Да, без вопросов.
Да, но сумму в пределах разумного.
Нет, как-нибудь обойдусь.
Нет, но буду искать этот же компонент, но зарегистрированный (crack).

Полезные ссылки

Сайт "Программирование на Delphi":
http://www.delphi.int.ru/

Форум сайта:
http://www.delphi.int.ru/forum/
Архив рассылки:
На Subscribe.Ru
На сайте

Разделы рассылки:

Авторское слово
Новые вопросы
Ответы на вопросы
Статья по Delphi
Файловый архив
Друзья
Юмор


Количество читателей рассылки: 5006.


Подписка на рассылку:

Программирование на DELPHI


Подписаться почтой

Лидеры по количеству баллов:

Место
Имя
Баллы
Статус
1
Ermakova Dasha
329
Специалист
2
Dron
323
Специалист
3
Садовников Владимир
297
Практикант
4
Feniks
296
Практикант
5
Матвеев И.В.
260
Практикант
6
Iron Monk
200
Практикант
7
Антон Трапезников
173
Практикант
8
midav.land.ru
172
Практикант
9
PVS
141
Студент
10
mvp
134
Студент
11
Лучников А.И.
131
Студент
12
Ершов Денис
130
Студент
13
Yurchik
105
Студент
14
VeroLom
90
Эксперт: 10-ый класс
15
Igor Danilevych
86
Эксперт: 9-ый класс

Некоторая статистическая информация (по системе "Эксперт"):

Статистика
На текущий момент
В прошлом выпуске
Динамика
Количество участников:
157
154
+3
Общее количество баллов:
5035
4908
+127 (!)
Средний балл:
32
32
-
Максимальный балл:
329
323
+6
Минимальный балл:
3
3
-
Адресов в зоне .RU:
114
113
+1


Основные правила нашей рассылки:

1. Не присылайте ответов на вопросы вроде "да я не знаю" или "да/нет". Такие ответы не публикуются.
2. Вопросы, не касающиеся Delphi, не принимаются (для этого существуют другие рассылки).
3. Запрещено присылать вложенные файлы, объёмом выше установленного ограничения (ограничения указаны в правилах).
4. Не изменяйте тем присылаемых писем. Письма с "неправильными" темами не обрабатываются! Используйте текстовый (не HTML) формат писем. HTML-теги применяйте только в том случае, если Вы уже достигли статуса, где это разрешено (см. правила).
5. Запрещено задавать вопросы, содержащие два (или несколько) вопросов разной тематики. Каждый из таких вопросов должен быть оформлен отдельным письмом.

Задать вопрос в рассылку   |   Задать вопрос с помощью web-формы   |   Система "Эксперт"


Вопросы

Вопрос #268 (автор вопроса: Chamra; вопрос отправлен: 08.03.2006 15:41):

Подскажите, как нужно написать программу, чтобы она выдавала список файлов в указанной папке с возможностью вывода на печать?  [Ответить на вопрос]

Вопрос #269 (автор вопроса: Максим Семкин; вопрос отправлен: 09.03.2006 10:18):

Здраствуйте, подскажите пожалуйста, как с помощью Delphi написать программу, которая закрывает все окна в принудительном порядке, без сохранения всех изменений или данных?  [Ответить на вопрос]

Вопрос #270 (автор вопроса: TSybik; вопрос отправлен: 09.03.2006 19:43):

Как сделать в Delphi 6 редактор (я его сделал уже), чтобы он был установочный, т.е. инсталлятор? Помогите пожалуйста.  [Ответить на вопрос]

Вопрос #271 (автор вопроса: Shutn1k; вопрос отправлен: 10.03.2006 12:16):

Добрый день! У меня такой вопрос: как написать функцию, которая будет соединяться с POP3 сервером и скачивать на компьютер новые письма, после чего удалять их на сервере (как The Bat! или Outlook)? Или какой компонент существует для этой цели, и где можно найти описание этого компонента на Великом и Могучем?  [Ответить на вопрос]

Вопрос #272 (автор вопроса: Zeon; вопрос отправлен: 10.03.2006 17:53):

Возвращаясь к вопросу № 242 предыдущей рассылки. Я не совсем правильно его сформулировал. Мне нужно подсчитать количество трафика, проходящего через мой компьютер. Можно посмотреть (например в свойствах соединения) общее количество входящего и исходящего трафика. А если его нужно расписать: Сколько куда ушло? Или, например поделить трафик на месный (Украинский) и зарубежный. Хотелось написать программу, которая будет всё это подсчитывать, вести логи, и предупреждать о превышении предоплаченого провайдером трафика.  [Ответить на вопрос]

Вопрос #273 (автор вопроса: Крылов И.В.; вопрос отправлен: 10.03.2006 19:43):

Проблема. В программе много справочников. Хочу их поместить в динамические библиотеки. Использую ADO. Не знаю, как передать соединение ADOConnection в DLL и привязать его там к ADOStoredProc или ADODataSet. Заранее спасибо.  [Ответить на вопрос]

Вопрос #274 (автор вопроса: Evgen Sandrong; вопрос отправлен: 11.03.2006 11:09):

Здравствуйте! Не подскажите ли Вы, как можно сделать такую форму на которой имеется кнопка, по нажатии которой появлялось дополнительное место на форме с другими компонентами, а при повторном нажатии это место опять скрывалось (наподобие кнопок VIDEO/VIS и CONFIG в Winamp'e)?  [Ответить на вопрос]

Вопрос #275 (автор вопроса: Андрей; вопрос отправлен: 12.03.2006 15:56):

При попытке использования компонента ICMPClient функция Ping, система выдает ошибку EIdSocketError №10022 Invalid argument. Попытка производилась на нескольких машинах под WinXP сборка проекта под Delphi 6 и 7. Только на одной машине выдает такую ошибку. Стандартный ping Windows работает, узлы пингуются. TCP Client тоже работает. Помогите пожалуйста разобраться, что это за ошибка, какие неверные аргументы и как от этого избавиться.  [Ответить на вопрос]

Вопрос #276 (автор вопроса: Иусов Сергей Ник.; вопрос отправлен: 17.03.2006 08:37):

Может кто знает, как заблокировать открытие CD-ROM'а, чтобы при нажатии на кнопку на приводе он не открывался? Требуется для того, чтобы обезопасить компьютер от посягательств 2-х летнего сына :)  [Ответить на вопрос]

Вопрос #277 (автор вопроса: moonlight; вопрос отправлен: 21.03.2006 13:59):

Есть Word-документ с шаблоном... В некоторых полях поставлены $переменные... Как с Delphi сделать вывод текста вместо этих переменных? Например: в Word стоит $FIO, при формировании с Delphi вместо этого нужно, чтобы подтянуло фамилию, заполненую в Delphi в формочке. Как организовать код?  [Ответить на вопрос]

Вопрос #278 (автор вопроса: Дмитрий; вопрос отправлен: 22.03.2006 15:53):

Пытаюсь получить доступ к "Личной адресной книге" Outlook. В цикле почему-то на метод Count вываливает ошибку - OLE error 00040482. Как побороть?

procedure TForm1.BitBtn2Click(Sender: TObject);
var
  MSOutlook, MyNameSpace, MyAddressBook, MyItem: Variant;
  s: string;
  i: Integer;
begin
  Screen.Cursor := crHourGlass;
  try
    MSOutlook := CreateOleObject('Outlook.Application');
    MyNameSpace := MSOutlook.GetNameSpace('MAPI');
    MyAddressBook := MyNamespace.AddressLists('Личная адресная книга');
    for i := 1 to 100 {MyAddressBook.AddressEntries.Count} do
      begin
        s := s + #13#13'Contact No: ' + IntToStr(i) + #13;
        MyItem := MyAddressBook.Item[i];
        s := s + 'Name: ' + MyItem.Name + #13;
        s := s + 'Address: ' + MyItem.Address + #13;
        //MyItem := MyAdressBook.AddressEntries.Item[i].Delete;
      end;
    Memo1.Lines.Text := s;
  except
    on E: Exception do MessageDlg(E.Message + #13 + s, mtError, [mbOk], 0);
  end;
  MSOutlook.Quit;

end;

[Ответить на вопрос]


Ответы на вопросы

Вопрос #252:
Как можно на Delphi написать программу, которая даст возможность не распаковывая файлы из архива смотреть их дату создания?

1. [Отвечает: Дмитрий Гордиенко (статус: Эксперт: 2-ой класс), 08.03.2006 13:03]: Взято отсюда: www.drkb.ru , кстати замечательный справочник, огромная благодарность авторам.

type
  TFileInfo = record
    Exists: boolean; //true если файл найден
    Name: string; //имя файла с расширением
    ShortName: string; //DOS 8.3 имя файла
    NameNoExt: string; //имя файла без расширения
    Extension: string; //расширение файла
    AssociatedFile: string; //программа с которой ассоциирован файл
    Path: string; // путь к файлу
    ShortPath: string; // doS 8.3 путь файла
    Drive: string; // дисковод на котором находится файл
    CreateDate: TDateTime; //время когда файл создан
    Size: Int64; // размер файла (работает для файлов и больше 2Gb)
    Attributes: record //нали?ие/отсутствие системных атрибутов
      ReadOnly: boolean;
      Hidden: boolean;
      System: boolean;
      Archive: boolean;
    end;
    ModifyDate: TDateTime; // время последнего изменения файла
    LastAccessDate: TDateTime; // дата последнего открытия файла
  end;
function ReadFileInfo(FileName: string): TFileInfo;
var
  ts: TSearchRec;
  function FileTime2DateTime(FT: _FileTime): TDateTime;
  var
    FileTime: _SystemTime;
  begin
    FileTimeToLocalFileTime(FT, FT);
    FileTimeToSystemTime(FT, FileTime);
    Result := EncodeDate(FileTime.wYear, FileTime.wMonth, FileTime.wDay) +
    EncodeTime(FileTime.wHour, FileTime.wMinute, FileTime.wSecond,
      FileTime.wMilliseconds);
  end;

  function AssociatedFile(FileExt: string): string;
  var
    key: string;
  begin
    with TRegistry.create do
    try
      RootKey := HKEY_CLASSES_ROOT;
      OpenKey(FileExt, false);
      Key := ReadString('');
      CloseKey;
      OpenKey(key + '\Shell\open\command', false);
      result := ReadString('');
      Closekey;
    finally
      free;
    end
  end;
begin
  Result.Name := ExtractFileName(FileName);
  Result.Extension := ExtractFileExt(FileName);
  Result.NameNoExt := Copy(Result.Name, 1, length(Result.Name) -
    length(Result.Extension));
  Result.Path := ExtractFilePath(FileName);
  Result.Drive := ExtractFileDrive(FileName);
  Result.ShortPath := ExtractShortPathName(ExtractFilePath(FileName));
  if lowercase(Result.Extension) <> '.exe' then
    Result.AssociatedFile := AssociatedFile(Result.Extension);
  if FindFirst(FileName, faAnyFile, ts) = 0 then
  begin
    Result.Exists := true;
    Result.CreateDate := FileDateToDateTime(ts.Time);
    Result.Size := ts.FindData.nFileSizeHigh * 4294967296 +
      ts.FindData.nFileSizeLow;
    Result.Attributes.ReadOnly := (faReadOnly and ts.Attr) > 0;
    Result.Attributes.Hidden := (faHidden and ts.Attr) > 0;
    Result.Attributes.System := (faSysFile and ts.Attr) > 0;
    Result.Attributes.Archive := (faArchive and ts.Attr) > 0;
    Result.ModifyDate := FileTime2DateTime(ts.FindData.ftLastWriteTime);
    Result.LastAccessDate :=
FileTime2DateTime(ts.FindData.ftLastAccessTime);
    Result.ShortName := ts.FindData.cAlternateFileName;
    Findclose(ts);
  end
  else
    Result.Exists := false;
end;

Оценка за ответ: 5.

2. [Отвечает: SiNiK (статус: Эксперт: 4-ый класс), 08.03.2006 13:50]: Для это можно использовать компонент ZipTV. Его минус - платность.

Оценка за ответ: 3.

3. [Отвечает: midav.land.ru (статус: Практикант), 09.03.2006 11:32]: Общего ответа нет. И быть не может, так как форматы в разных архивов разные. Но в случае с zip архивами это возможно, дело в том,что сам zip архив имеет простую структуру. Точенее, он состоит из последовательных структур. Прочитавши из, можно вытянуть не только время, но и другие характеристики.

[]
//enum used for compression format
typedef enum {
COMP_STORED = 0,
COMP_SHRUNK = 1,
COMP_REDUCED1 = 2,
COMP_REDUCED2 = 3,
COMP_REDUCED3 = 4,
COMP_REDUCED4 = 5,
COMP_IMPLODED = 6,
COMP_TOKEN = 7,
COMP_DEFLATE = 8,
COMP_DEFLATE64 = 9
} COMPTYPE;

// Defines a file record
typedef struct {
// Header for the file
char frSignature[4]; //0x04034b50
ushort frVersion;
ushort frFlags;
COMPTYPE frCompression;
DOSTIME frFileTime;
DOSDATE frFileDate;
uint frCrc ;
uint frCompressedSize;
uint frUncompressedSize;
ushort frFileNameLength;
ushort frExtraFieldLength;
if( frFileNameLength > 0 )
char frFileName[ frFileNameLength ];
if( frExtraFieldLength > 0 )
uchar frExtraField[ frExtraFieldLength ];

// Compressed data
SetBackColor( cNone );
if( frCompressedSize > 0 )
uchar frData[ frCompressedSize ];

// Data descriptor
if( frFlags & 0x04 )
{
SetBackColor( cLtAqua );
uint frCrc2;
uint frCompressedSize2;
uint frUncompressedSize2;
}

} ZIPFILERECORD ;

// Defines an entry in the directory table
typedef struct {
char deSignature[4]; //0x02014b50
ushort deVersionMadeBy;
ushort deVersionToExtract;
ushort deFlags;
COMPTYPE deCompression;
DOSTIME deFileTime;
DOSDATE deFileDate;
uint deCrc ;
uint deCompressedSize;
uint deUncompressedSize;
ushort deFileNameLength;
ushort deExtraFieldLength;
ushort deFileCommentLength;
ushort deDiskNumberStart;
ushort deInternalAttributes;
uint deExternalAttributes;
uint deHeaderOffset;
if( deFileNameLength > 0 )
char deFileName[ deFileNameLength ];
if( deExtraFieldLength > 0 )
uchar deExtraField[ deExtraFieldLength ];
if( deFileCommentLength > 0 )
uchar deFileCommand[ deExtraFieldLength ];
} ZIPDIRENTRY ;

// Defines the digital signature
typedef struct {
char dsSignature[4]; //0x05054b50
ushort dsDataLength;
if( dsDataLength > 0 )
uchar dsData[ dsDataLength ];
} ZIPDIGITALSIG;

// Defines the end of central directory locator
typedef struct {
char elSignature[4]; //0x06054b50
ushort elDiskNumber;
ushort elStartDiskNumber;
ushort elEntriesOnDisk;
ushort elEntriesInDirectory;
uint elDirectorySize;
uint elDirectoryOffset;
ushort elCommentLength;
if( elCommentLength > 0 )
char elComment[ elCommentLength ];
} ZIPENDLOCATOR;

//--------------------------------------------

// Функция чтения имени файла

string ReadZIPFILERECORD( ZIPFILERECORD &file )
{
if( exists( file.frFileName ) )
return file.frFileName;
else
return "";
}

string ReadZIPDIRENTRY( ZIPDIRENTRY &entry )
{
if( exists( entry.deFileName ) )
return entry.deFileName;
else
return "";
}

//--------------------------------------------

// Определение структур файла
local uint tag;
LittleEndian();
while( !FEof() )
{
// Прочитать тэг
tag = ReadUInt( FTell() );

// Читаем данные в зависимости от тега, но он должен начинаться на 'PK'.
if( tag == 0x04034b50 )
{
ZIPFILERECORD file; //Это у нас файл
}
else if( tag == 0x02014b50 )
{
ZIPDIRENTRY dirEntry; //А это - каталог
}
else if( tag == 0x05054b50 )
{
ZIPDIGITALSIG digitalSig;
}
else if( tag == 0x06054b50 )
{
ZIPENDLOCATOR endLocator; //Эта запись должна быть в конце
файла
}
else
{
Warning( "Неизвестный тэг." );
return -1;
}
}
[]

Посмотрите внимательно на этот кусок скриптового кода. Замечу, что многие форматы - это переименований zip. Опознать можно по первым двум буковкам - PK.

Оценка за ответ: 4.

4. [Отвечает: Ершов Денис (статус: Студент), 15.03.2006 08:23]: Очень удобно для этого использовать библиотеку ZipTV ( www.ziptv.com ). Думаю все будет сказано примером из файла справки.

Description
Returns the Date of the specified compressed file.

Example
VAR RetDate: TDateTime;
ZipTV1.ArchiveFile := ‘MyArc.ZIP’; (* Assign the archive to get info from *)
RetDate := ZipTV1.GetFileDate(Filename);

Кроме того посмотри ответ на вопрос №167.Таммнойбылипредложены unrar.dll и интерфейс к ней. Данным инструментом можно получить всю информацию о RAR.

Оценка за ответ: 5.

Вопрос #253:
На Delphi нужно сделать так, чтобы программа стартовала как сервисная служба Windows, или сделать сервис Windows который будет запускать программу. Можно ли решить эту проблему?

1. [Отвечает: Дмитрий Гордиенко (статус: Эксперт: 2-ой класс), 08.03.2006 12:28]: File -> new->other->service application. В справке раздел TService.

Оценка за ответ: 4.

2. [Отвечает: SiNiK (статус: Эксперт: 4-ый класс), 24.03.2006 13:10]: Создай новый проект типа Service application. И осуществляй задуманное.

Оценка за ответ: 4.

3. [Отвечает: Yurchik (статус: Студент), 24.03.2006 13:10]: Можно сделать сервис, и при том легко.Выбираешь в Дельфи пункт меню File | New | Other... Затем на закладке New выбираешь Service Application. Сохраняешь созданные файлы, собираешь проект и все! Сервис готов! Его можно проинсталлировать, запустив с ключем /INSTALL, и тогда он появится в Service Control Manager (SCM). Для деинсталляции запускаешь его с ключом /UNINSTALL. Обрабатывая соответствующие события (напр. OnStart, OnContinue) добиваешься нужной функциональности сервиса. Подробнее смотри справку Дельфи, раздел Service applications.

Оценка за ответ: 5.

4. [Отвечает: midav.land.ru (статус: Практикант), 24.03.2006 13:10]: Если вы в меню File->New ... Внимательно посмотрите, то найдёте там такой пункт как Service. Делфи создаст шаблон, который останеться только заполнить. Замечу, что создание служб отличается от создания обыкновенных программ. Но Делфи частично нивелирует эту разницу.

Оценка за ответ: 5.

Вопрос #254:
Как можно добавить в программу возможность оповещения по электронному адресу и по IP адресу (несколько адресов)?

1. [Отвечает: Zeon (статус: Эксперт: 7-ой класс), 10.03.2006 16:01]: П отребуется компонент 'TNMSMTP'. Этот компонент входит в поставляется с Delphi и его можно найти на закладке 'Fastnet'.

procedure TForm1.Button1Click(Sender: TObject);  
begin  
NMSMTP1.Host := 'адрес почтового сервера';
NMSMTP1.UserID := 'типа имя твоё';
NMSMTP1.Connect;
NMSMTP1.PostMessage.FromAddress := 'твой адрес';
NMSMTP1.PostMessage.ToAddress.Text := 'кому';
NMSMTP1.PostMessage.Body.Text := 'Текст письма';
NMSMTP1.PostMessage.Subject := 'Тема письма';
NMSMTP1.SendMail;
end;

А если по IP, то нужно писать серверную часть, которая будет всегда запущена на твоём комне и будет принимыть эти сообщения от всех клиентских програм. И к тому-же, не забывай что у многих могут быть фаерволы, которые так просто не пропустсят неизвесные запросы на неизвесный IP.

Оценка за ответ: 5.

2. [Отвечает: sattar (статус: Эксперт: 3-ий класс), 11.03.2006 16:28]:

по IP адресу (несколько адресов)
var
i:integer;
IP:array[1..10] of string;//масив з IP яким відсилаються повідомлення
begin
for i:=1 to high(IP) do
ShellExecute(Handle,nil,'net.exe',PAnsiChar('send'+IP[i]+'text_of_message'),nil,SW_HIDE);
end;

Оценка за ответ: 4.

Вопрос #255:
Как с помощью ActiveX в Delphi осуществить доступ к сканеру?

1. [Отвечает: SiNiK (статус: Эксперт: 4-ый класс), 24.03.2006 13:16]: Попробуй использовать компонент Envision Image Library. Он как раз позволяет это делать.

Оценка за ответ: 3.

2. [Отвечает: LeVeL (статус: Эксперт: 1-ый класс), 24.03.2006 13:16]: А вообще зачем через ActiveX, ведь и средствами Delphi возможен полный доступ к TWAIN. Рекомендую зарегистрироваться на borland.com и там среди примеров есть и такой (23864_twain_toolbox.zip). http://cc.borland.com/Download.aspx?id=23864 НО, для того, чтобы скачать данный файл надо зарегестрироваться. Регистрация занимает порядка 2-5 минут, т.к. письмо с ссылкой на авторизацию логина на ваш ящик приходит мгновенно. Загрузить прикреплённый файл >>

Оценка за ответ: 5.

3. [Отвечает: midav.land.ru (статус: Практикант), 24.03.2006 13:16]: Нужно именно ActiveX? Доступ к сканеру можно осуществить с помощью интерфейса Twain. Но этот интерфейс до сих пор точно не стандартизирован, поэтому возможны некоторые неурядицы. А в общем, читайте здесь http://www.delphiworld.narod.ru/base/scan.html

Оценка за ответ: 4.

4. [Отвечает: PVS (статус: Студент), 24.03.2006 13:16]: В Windows98 для этого был ActiveX, который назывался Kodak Imaging. Его можна перенести и под другие версии.ДляэтогонадоскопироватьизWin98 файлы Imgscan.ocx, Imgcmn.dll, OI*400.dll (самому надо было, так что набор файлов проверен - все работает) и, конечно,зарегистрироватьocx (regsvr32 imgscan.ocx).

Оценка за ответ: 5.

5. [Отвечает: sattar (статус: Эксперт: 3-ий класс), 11.03.2006 16:28]: http://excode.ru/?mod=article&id=text&artid=338&action=showart&page=1&ex=133c5b3371630b900fc7d993e881f5b1

Оценка за ответ: 4.

Вопрос #256:
Подскажите, чем открыть для редактирования файлы gdb (или хотя бы посмотреть)?

1. [Отвечает: Дмитрий Гордиенко (статус: Эксперт: 2-ой класс), 08.03.2006 12:30]: IBExpert ( www.*ibexpert*.com ) и уставноленный interbase

Оценка за ответ: 3.

2. [Отвечает: midav.land.ru (статус: Практикант), 24.03.2006 13:20]: Это файлы базы данных InterBase (или FireBird). Прочитать можно например с помощью IBExpert ( http://www.ibexpert.com ), правда InterBase (или FireBird) также надо.

Оценка за ответ: 5.

3. [Отвечает: PVS (статус: Студент), 24.03.2006 13:20]: gdb - это файлы Interbase (он же Firebird, он же Yaffill). Чтобы их читать нужен соответствующий клиент+сервер или embedded-версия (клиент+сервер 2 в одном), а также какая-нибудь программа, которая присоединится к этой базе данных. Могу посоветовать IBExpert - мне он нравится и в Internet'e отклики достаточно хорошие.

Оценка за ответ: 5.

Вопрос #257:
Уважаемые дельфяне! Есть проблема! Как писать текстовый файл с машины Win95 на машину с Windows2000 Server? Протокол только NetBios, имена и рабочая группа известы,частота записи от 3 сек и его обьём около 500 кБ. Этот файл с такой же частотой открывается для считывания информации другой программой. Может подскажете другой вариант передачи текстовой информации между данными машинами?

1. [Отвечает: midav.land.ru (статус: Практикант), 24.03.2006 13:22]: Если так часто надо писать текстовые данные, то тут лучшим решением будет передача через сокеты, например с помощью компонентов Indy. Правда для Win95 сетевая работа очень напряжна - ну не сетевая она, лучше перейти на 98.

Оценка за ответ: 4.

2. [Отвечает: PVS (статус: Студент), 24.03.2006 13:22]: Можна открывать файл по UNC-имени (\\имя_сервера\ресурс\файл), а можна данные по Socket'ам гонять...

Оценка за ответ: 3.

3. [Отвечает: Zeon (статус: Эксперт: 7-ой класс), 10.03.2006 16:04]: Отправляй по сокетам. Как текст. Как это делается, уже не раз обсуждалось в этой рассылке.

Оценка за ответ: 4.

Вопрос #258:
Как запустить Delphi 6.0 под пользователем?

1. [Отвечает: midav.land.ru (статус: Практикант), 24.03.2006 13:24]: С двойного клика по иконке :). А на самом деле наверное имелось ввиду "не под админом". Это решается следующим образом. Нужно дать полный доступ на каталог Bin (можно конечно на некоторые файлы, но чтобы их найти, прийдётся несколько раз позапускать, и посмотреть, какие файлы изменяются). Потом надо дать доступ на каталог Project, так как в них по умолчанию Делфи сбрасывает dcu и exe тех файлов, которые не успел сохранить. Всё это конечно верно, если у тебя NTFS. Если FAT32, то эти проблемы не возникают. В некоторых случаях нужно покалдовать с доступом на ветки реестра, где храниться делфа (искать по ключевому слову Borland).

Оценка за ответ: 5.

2. [Отвечает: PVS (статус: Студент), 24.03.2006 13:24]: Кажется достаточно запустить инсталяцию и выбрать "Исправить", когда-то по сети бродил reg-файл, который просто исправлял данные в реестре.

Оценка за ответ: 4.

3. [Отвечает: Zeon (статус: Эксперт: 7-ой класс), 10.03.2006 16:07]: Так же, как и любую другую програму: runas.

Оценка за ответ: 4.

Вопрос #259:
Как скопировать часть текста из TRichEdit в TDBRichEdit, сохраняя форматирование?

1. [Отвечает: Ermakova Dasha (статус: Специалист), 14.03.2006 16:01]: Если формат всего текста одинаковый, то просто:

DBRichEdit1.Font:=RichEdit1.Font;
DBRichEdit1.Text:=Copy(RichEdit1.Text,BNum,Len);

Если шрифт части текста отличается, то скорее всего руками. Предлагаю такой вариант (BNum, ENum соответственно номер первого и последнего символа копируемой части. В данном примере с 8-го до последнего символа):

procedure TForm1.Button1Click(Sender: TObject);
var
i, BNum, ENum: integer;
begin
BNum:=8;
ENum:=Length(RichEdit1.Text);
DBRichEdit1.Text:=Copy(RichEdit1.Text,BNum,ENum-BNum+1);
  for i:=BNum to ENum do
  begin
  RichEdit1.SelStart:=i;
  RichEdit1.SelLength:=1;
  DBRichEdit1.SelStart:=i-BNum;
  DBRichEdit1.SelLength:=1;
  DBRichEdit1.SelAttributes:=RichEdit1.SelAttributes;
  end;
end;

Оценка за ответ: 5.

Вопрос #262:
При программном изменении настроек в Internet Explorer (допустим, убираем показ картинок) нужно также программно их применить (иначе изменения всупают в силу только после перезагрузки IE). Как быть?

1. [Отвечает: SiNiK (статус: Эксперт: 4-ый класс), 24.03.2006 13:28]: Возможно поможет:
Обновить все окна программы Internet Explorer
Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

uses
  MSHTML_TLB, SHDocVw_TLB;

procedure TForm1.Button1Click(Sender: TObject);
var
  ShellWindow: IShellWindows;
  WB: IWebbrowser2;
  spDisp: IDispatch;
  IDoc1: IHTMLDocument2;
  k: Integer;
begin
  ShellWindow := CoShellWindows.Create;
  for k := 0 to ShellWindow.Count do
  begin
    spDisp := ShellWindow.Item(k);
    if spDisp = nil then Continue;
    spDisp.QueryInterface(iWebBrowser2, WB);
    if WB <> nil then
    begin
      WB.Document.QueryInterface(IHTMLDocument2, iDoc1);
      if iDoc1 <> nil then
      begin
        WB := ShellWindow.Item(k) as IWebbrowser2;
        WB.Refresh;
      end;
    end;
  end;
end;

Оценка за ответ: 5.

2. [Отвечает: Zeon (статус: Эксперт: 7-ой класс), 10.03.2006 16:10]: Например, просто прибить его по хэндлу, а потом запустить снова(exec).

Оценка за ответ: 3.

Вопрос #265:
Подскажите, где можно найти описание кодов ошибок для MS Dos Client? Особенно интересует ошибка 5637.

1. [Отвечает: Ermakova Dasha (статус: Специалист), 13.03.2006 19:13]: Нашла вот такую страничку: https://mynoc.calence.com/enportal-custom/NSDB/html/all_sig_ids.html. Не уверена, что это именно для MS Dos Client, потому что в результатах поиска он упоминался, а на самой страничке - нет, но похоже на правду :).

Оценка за ответ: 4.

Вопрос #266:
У меня вопрос следующего седержания: У Windows Media 9 и 10 есть такая фишка: правой кнопкой мыши на треепанели инструментовПроигрыватель Windows Media. Теперь, когда запускаешь проигрыватель и его сворачиваешь, появляется панелька с кнопоками управления проигрывателем! Насколко я понимаю - это какой-то ActiveX и что может его надо где-то зарегистрировать и тогда он там будет появлятся? Никто не может мне подсказать, как сделать примерный аналог этого? Спасибо!

1. [Отвечает: Дмитрий Гордиенко (статус: Эксперт: 2-ой класс), 08.03.2006 12:38]: Component -> Import ActiveX Control. Следует обратить внимание на импорт из файла c:\windows\system32\wmp.dll - там разместился искомый комопнент. Далее как при импорте любого ActiveX Control.

Оценка за ответ: 5.

Вопрос #267:
Здравствуйте, у меня такой вопрос: как можно с помощью Delphi организовать поисковую систему по FTP-ресурсам в локальной сети?

1. [Отвечает: midav.land.ru (статус: Практикант), 24.03.2006 13:31]: А почему нельзя? Поиск осуществляется аналогично обычному поиску - рекурсией. Для работы с FTP используйте компоненты, Indy к примеру.

Оценка за ответ: 3.

Все вопросы и ответы на них Вы всегда можете найти на нашем сайте в разделе "Delphi-Эксперт".


Статьи  >>

Работа со строковыми типами данных

Автор: Ерёмин Андрей

Строковый тип данных - один из самых часто используемых в программах тип. Действительно, без него не обходится практически ни один алгоритм. Даже программы, выполняющие исключительно математические операции, порой, написаны с использованием строковых типов данных.

Строка - это последовательность символов. В Object Pascal существует несколько строковых типов. Вот основные из них:

Тип данных
Максимальная длина
Используемая память
Используется для...
ShortString
255 символов
от 2 до 256 байт
Минимальная совместимость, хранение небольших строк
AnsiString
около 2^31 символов
от 4 байт до 2 Гб
8-битные символы (ANSI), DBCS ANSI, MBCS ANSI и т.д.
WideString
около 2^30 символов
от 4 байт до 2 Гб
Юникод-символы - многопользовательские сервера, мультиязыковые приложения

Для большинства целей подходит тип AnsiString (иногда называется Long String).

Стандартные функции обработки строк:

1) Функция Length(Str: String) - возвращает длину строки (количество символов). Пример:

var
   Str: String; L: Integer;
{ ... }
Str:='Hello!';
L:=Length(Str);  { L = 6 }

2) Функция SetLength(Str: String; NewLength: Integer) позволяет изменить длину строки. Если строка содержала большее количество символов, чем задано в функции, то "лишние" символы обрезаются. Пример:

var Str: String;
{ ... }
Str:='Hello, world!';
SetLength(Str, 5); { Str = "Hello" }

3) Функция Pos(SubStr, Str: String) - возвращает позицию подстроки в строке. Нумерация символов начинается с единицы (1). В случае отсутствия подстроки в строке возращается 0. Пример:

var Str1, Str2: String; P: Integer;
{ ... }
Str1:='Hi! How do you do?';
Str2:='do';
P:=Pos(Str2, Str1);  { P = 9 }

4) Функция Copy(Str: String; Start, Length: Integer) - возвращает часть строки Str, начиная с символа Start длиной Length. Ограничений на Length нет - если оно превышает количество символов от Start до конца строки, то строка будет скопирована до конца. Пример:

var Str1, Str2: String;
{ ... }
Str1:='This is a test for Copy() function.';
Str2:=Copy(Str1, 11, 4); { Str2 = "test" }

5) Функция Delete(Str: String; Start, Length: Integer) - удаляет из строки Str символы, начиная с позиции Start длиной Length. Пример:

var Str1: String;
{ ... }
Str1:='Hello, world!';
Delete(Str1, 6, 7); { Str1 = "Hello!" }

6) Функции UpperCase(Str: String) и LowerCase(Str: String) преобразуют строку соответственно в верхний и нижний регистры:

var Str1, Str2, Str3: String;
{ ... }
Str1:='hELLo';
Str2:=UpperCase(Str1); { Str2 = "HELLO" }
Str3:=LowerCase(Str1); { Str3 = "hello" }

Строки можно сравнивать друг с другом стандартным способом:

var Str1, Str2, Str3: String; B1, B2: Boolean;
{ ... }
Str1:='123';
Str2:='456';
Str3:='123';
B1:=(Str1 = Str2); { B1 = False }
B2:=(Str1 = Str3); { B2 = True }

Если строки полностью идентичны, логическое выражение станет равным True.

Дополнительные функции обработки строк:

В модуле StrUtils.pas содержатся полезные функции для обработки строковых переменных. Чтобы подключить этот модуль к программе, нужно добавить его имя (StrUtils) в раздел Uses.

1) PosEx(SubStr, Str: String; Offset: Integer) - функция аналогична функции Pos(), но позволяет задать отступ от начала строки для поиска. Если значение Offset задано (оно не является обязательным), то поиск начинается с символа Offset в строке. Если Offset больше длины строки Str, то функция возратит 0. Также 0 возвращается, если подстрока не найдена в строке. Пример:

uses StrUtils;
{ ... }
var Str1, Str2: String; P1, P2: Integer;
{ ... }
Str1:='Hello! How do you do?';
Str2:='do';
P1:=PosEx(Str2, Str1, 1); { P1 = 12 }
P2:=PosEx(Str2, Str1, 15); { P2 = 19 }

2) Функция AnsiReplaceStr(Str, FromText, ToText: String) - производит замену выражения FromText на выражение ToText в строке Str. Поиск осуществляется с учётом регистра символов. Следует учитывать, что функция НЕ изменяет самой строки Str, а только возвращает строку с произведёнными заменами. Пример:

uses StrUtils;
{ ... }
var Str1, Str2, Str3, Str4: String;
{ ... }
Str1:='ABCabcAaBbCc';
Str2:='abc';
Str3:='123';
Str4:=AnsiReplaceStr(Str1, Str2, Str3); { Str4 = "ABC123AaBbCc" }

3) Функция AnsiReplaceText(Str, FromText, ToText: String) - выполняет то же самое действие, что и AnsiReplaceStr(), но с одним исключением - замена производится без учёта регистра. Пример:

uses StrUtils;
{ ... }
var Str1, Str2, Str3, Str4: String;
{ ... }
Str1:='ABCabcAaBbCc';
Str2:='abc';
Str3:='123';
Str4:=AnsiReplaceText(Str1, Str2, Str3); { Str4 = "123123AaBbCc" }

4) Функция DupeString(Str: String; Count: Integer) - возвращает строку, образовавшуюся из строки Str её копированием Count раз. Пример:

uses StrUtils;
{ ... }
var Str1, Str2: String;
{ ... }
Str1:='123';
Str2:=DupeString(Str1, 5); { Str2 = "123123123123123" }

5) Функции ReverseString(Str: String) и AnsiReverseString(Str: AnsiString) - инвертируют строку, т.е. располагают её символы в обратном порядке. Пример:

uses StrUtils;
{ ... }
var Str1: String;
{ ... }
Str1:='0123456789';
Str1:=ReverseString(Str1); { Str1 = "9876543210" }

6) Функция IfThen(Value: Boolean; ATrue, AFalse: String) - возвращает строку ATrue, если Value = True и строку AFalse если Value = False. Параметр AFalse является необязательным - в случае его отсутствия возвращается пустая строка.

uses StrUtils;
{ ... }
var Str1, Str2: String;
{ ... }
Str1:=IfThen(True, 'Yes'); { Str1 = "Yes" }
Str2:=IfThen(False, 'Yes', 'No'); { Str2 = "No" }

Мы рассмотрели функции, позволяющие выполнять со строками практически любые манипуляции. Как правило, вместо строки с указанным типом данных, можно использовать и другой тип - всё воспринимается одинаково. Но иногда требуются преобразования. Например, многие методы компонент требуют параметр типа PChar, получить который можно из обычного типа String функцией PChar(Str: String):

uses ShellAPI;
{ ... }
var FileName: String;
{ ... }
FileName:='C:\WINDOWS\notepad.exe';
ShellExecute(0, 'open', PChar(FileName), '', '', SW_SHOWNORMAL);

Тип Char представляет собой один-единственный символ. Работать с ним можно как и со строковым типом. Для работы с символами также существует несколько функций:

Chr(Code: Byte) - возвращает символ с указанным кодом (по стандарту ASCII):

var A: Char;
{ ... }
A:=Chr(69); { A = "E" }

Ord(X: Ordinal) - возвращает код указанного символа, т.е. выполняет противоположное действие функции Chr():

var X: Integer;
{ ... }
X:=Ord('F'); { X = 70 }

Из строки можно получить любой её символ - следует рассматривать строку как массив. Например:

var Str, S: String; P: Char;
{ ... }
Str:='Hello!';
S:=Str[2]; { S = "e" }
P:=Str[5]; { P = "o" }

В этой статье описаны основные приёмы работы со строковыми типами данных. Как правило, этих данных достаточно для написания любого алгоритма.

Любой из читателей может присылть свои статьи по адресу info@delphi.int.ru и они будут опубликованы в ближайших выпусках рассылки и на сайте. За каждую статью полагается бонус в размере 10 баллов. Статьи, полностью взятые с других сайтов, без указания ссылок на авторство, не публикуются.


Файловый архив  >>

Из данного раздела Вы можете скачать различные файлы: компоненты, plug-in'ы для Delphi, документацию по программированию, программы, игры, написанные на Delphi и всё остальное... Вы можете добавить свои файлы в данный раздел. Чтобы сделать это, пожалуйста, заполните форму на сайте.

К сожалению, новых файлов на сайте нет.

Название / описание файла
Категория
Объём
Ссылки
Ссылки  >>

Здесь представлены ссылки на дружественные сайты. Обмен ссылками и баннерами приветствуется для сайтов схожей тематики. Здесь представлены самые последние ссылки:

На сайте собрана большая коллекция компонентов, исходников, статей, книг, что пригодится начинающему программисту. Всё это и многое другое вы найдёте на этом сайте.
http://romodos.pp.ru/
Romodos Software - Лучшие бесплатные программы, игры, музыка, рассылки, анекдоты, статьи, учебники по Delphi, HTML, JavaScript, Windows.
http://www.sassoft.narod.ru/
На данном сайте вы сможете найти разные полезные программы. Также имеется подписка на рассылку и разная полезная информация программисту.
http://www.excode.ru/
Статьи, исходники, компоненты, книги, кодерский магазин.
 
Рассылки Subscribe.Ru
Интернет для Delphi-программиста
Visual Basic для новичков и профессионалов
   
 

Юмор.

Вопрос:
- Помогите найти "дрoва" на крышку от батареек у радиомыши.

:))

- Папа, а хакеры хорошо получают?
- Хорошо, сынок, лет этак пятнадцать...

:))

Хакеpы из Санкт-Петеpбуpга взломали сеть Microsoft и внесли изменения в ключевые коды новейших pазpаботок коpпоpации.
Microsoft выpажает им благодаpность - тепеpь всё pаботает.

:))

- В чем заключается многозадачность Windows?
- Она глючит и работает одновременно.

:))

Чуваку надоело работать с Windows 95 и он выдернул шнур из розетки.....
На экране надпись "А вы уверены?"

:))

- Можно ли загадать желание, если сидишь между двумя программистами?
- Можно! Только глючить будет.

:))

- Как жизнь?
- Слоями...
Adobe Photoshop

:))

Анекдоты прислал: Bruder.

Присылайте компьютерные анекдоты и истории по этой ссылке: info@delphi.int.ru и они обязательно будут опубликованы.

Товарищи программисты! Проявляйте свою активность. Давайте помогать друг другу! Если вы не нашли ответа на свой вопрос, не отчаивайтесь! Количество подписчиков постоянно растёт и, наверняка, найдётся тот человек, который поможет вам!
Ведущий рассылки, Ерёмин Андрей.

В избранное