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

RusFAQ.ru: Программирование на Delphi


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 1050
от 31.01.2008, 10:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 433, Экспертов: 60
В номере:Вопросов: 6, Ответов: 16

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 120078: Здравствуйте, уважаемые эксперты! Пишу свой класс для работы с текстовыми файлами некоторого формата. В процессе работы возникли следующие вопросы. 1. Одним из полей класса является StringList, в который при создании объекта класса из файла...
Вопрос № 120102: Здравствуйте, уважаемые эксперты. Вопрос такой: как из Delphi открыть указанный файл закрепленным по умолчанию в системе приложением для документов Microsoft Word? Спасибо за ответы...
Вопрос № 120107: Уважаемые эксперты помогите! У меня такая проблема необходимо реализовать отображение, прокрутку изображений загруженных в приложение, как предпросмотр, прокрутка страниц в левой части Adobe PDF Reader'а. С помошью какого компонента это можно реализо...
Вопрос № 120108: Почему нулевой датой является 30,12,1899 ? 20 век? почему не 31 число?...
Вопрос № 120111: Здрасте! Нужно сделать проверку на наличие папки, и если она есть, то удалить её. Спасибо заранее! З.Ы. У меня Delphi 7....
Вопрос № 120128: Здравствуете! Подскажите, плиз, как мне сделать в функции проверку в строке 6: если пользователь ввел не 1 символ, а два или вообще его не ввел, то вывести результат = 0. Со String все получается, а как это делается с Char? ...

Вопрос № 120.078
Здравствуйте, уважаемые эксперты!
Пишу свой класс для работы с текстовыми файлами некоторого формата. В процессе работы возникли следующие вопросы.
1. Одним из полей класса является StringList, в который при создании объекта класса из файла загружаются строки вида "Имя=Значение" и необходимо подсчитать количество строк, у которых одинаковое "Имя". Если это делать при помощи конструкции
if MidStr(FFileStrings.Strings[i],1,2)='SR' then Inc(FPlotCount);
то все подсчитывается корректно. Но когда пытаюсь воспользоваться таким кодом
if FFileStrings.Names[i]='SR' then Inc(FPlotCount);
то при выполнении программы получаю ошибку "List index (0) out of bounds". В чем здесь может быть проблема?
2. В этом же классе, в одном из методов нужно получить полную копию StringList'a в буферной переменной, над которой и будут производится действия, при этом исходный StringList должен оставаться неизменным. Пробовал так:
tmp:=TStringList.Create;
tmp.Assign(FFileStrings);
и
tmp.AddStrings(FFileStrings);
ничего не получается. В чем может быть проблема и как правильно это делать?
Часть кода класса прилагаю.

Приложение:

Отправлен: 25.01.2008, 09:49
Вопрос задал: Voltron (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Selya
Здравствуйте, Voltron!
1. Попробуйте так:

if SameText(FFileStrings.Names[i], 'SR') then Inc(FPlotCount);

У меня получилось и "List index (0) out of bounds". В вашем случае, проверьте количество строк в отладчике, возможно файл не загрузился.

2. В тексте вопроса всё правильно и должно рвботать:

tmp:=TStringList.Create;
try
tmp.Assign(FFileStrings);
...
finally
tmp.Free;
end;

А в коде снимите коментарий с
tmp.Assign(FFileStrings);

Ответ отправил: Selya (статус: 4-ый класс)
Ответ отправлен: 26.01.2008, 14:47


Вопрос № 120.102
Здравствуйте, уважаемые эксперты.
Вопрос такой: как из Delphi открыть указанный файл закрепленным по умолчанию в системе приложением для документов Microsoft Word?

Спасибо за ответы
Отправлен: 25.01.2008, 12:17
Вопрос задал: Alexander L. (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ranmasao
Здравствуйте, Alexander L.!
есть несколько способов: например можно через ShellExecute вызвать Word с именем файла в качестве параметра, а можно через OLE запустить Word и через OLE открыть в нем файл. Причем с OLE есть два способа: можно задействовать интерфейс через переменную типа OLEVariant, а можно использовать OLE-компонент, входящий в стандартную поставку Delphi (находится кажется на палитре "OLE servers").
Ответ отправил: Ranmasao (статус: 2-ой класс)
Ответ отправлен: 25.01.2008, 12:28
Оценка за ответ: 3
Комментарий оценки:
Ответ частично правильный, поскольку речь идет не только о запуске MS Office.

Отвечает: Drbear
Здравствуйте, Alexander L.!

Попробуйте использовать ShellExecute.
Пример кода в приложении, на форме кнопка и OpenDialog.

Приложение:

Ответ отправил: Drbear (статус: 6-ой класс)
Ответ отправлен: 25.01.2008, 12:31
Оценка за ответ: 5
Комментарий оценки:
Правильный ответ, именно то, что мне нужно было. Если в системе установлен Open Office или другое приложение, запускается именно оно, а не MS Word. Спасибо.

Отвечает: Дегтярев Антон Александрович
Здравствуйте, Alexander L.!
В uses допишите ComObj
var
MsWord : Variant;
begin
MsWord := CreateOleObject('Word.Application');
MsWord. Documents.Open('путь до файла');
end;

Если вы будете работать через OleObject любую операцию можно посмотреть через макросы.
---------
Все грибы съедобны, но некоторые - только раз в жизни
Ответ отправил: Дегтярев Антон Александрович (статус: 4-ый класс)
Ответ отправлен: 25.01.2008, 12:42
Оценка за ответ: 2
Комментарий оценки:
Вопрос был об приложении "по умолчанию", а не конкретно о MS Office. А если он не установлен? то файл не откроется. Все равно спасибо за ответ.

Отвечает: Genia007
Здравствуйте, Alexander L.!
Модуль ShellAPI

С помощью функции ShellExecute.

Функция ShellExecute позволяет выполнить любое приложение Windows. Можно также открыть файл документа, что означает выполнение связанного с ним приложения и загрузку в него этого документа. Например, обычно с документами, имеющими расширение .doc, связан Winword. В этом случае открыть файл, например, с именем 'file.doc' означает запустить Winword и передать ему в качестве параметра имя файла 'file.doc'.
ShellExecute(Handle,nil,'file.doc',nil,nil,SW_RESTORE);
Ответ отправил: Genia007 (статус: 5-ый класс)
Ответ отправлен: 27.01.2008, 15:11


Вопрос № 120.107
Уважаемые эксперты помогите! У меня такая проблема необходимо реализовать отображение, прокрутку изображений загруженных в приложение, как предпросмотр, прокрутка страниц в левой части Adobe PDF Reader'а. С помошью какого компонента это можно реализовать ?
Отправлен: 25.01.2008, 12:35
Вопрос задал: Черных Максим (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Drbear
Здравствуйте, Черных Максим!

Можно использовать динамически создаваемые TImage и ScrollBox
Пример кода в приложении, на форме пустой ScrollBox и кнопка.

Приложение:

Ответ отправил: Drbear (статус: 6-ой класс)
Ответ отправлен: 25.01.2008, 13:00
Оценка за ответ: 5

Отвечает: PavelGM
Здравствуйте, Черных Максим!

Еще можно предложить TListView в режиме vsIcons, заполняя связанный с ним ImageList картинками.
Ответ отправил: PavelGM (статус: Студент)
Ответ отправлен: 25.01.2008, 18:03


Вопрос № 120.108

Почему нулевой датой является 30,12,1899 ?
20 век? почему не 31 число?

Приложение:

Отправлен: 25.01.2008, 12:37
Вопрос задал: Raptor3 (статус: 4-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Николай Владимирович / Н.В.
Здравствуйте, Raptor3!
Потому что фирма Borland так захотела когда писала Delphi :)
Насколько мне известно, эта дата просто считается стандартной датой начала отсчета.

Из справки:

The integral part of a Delphi TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of the TDateTime value is fraction of a 24 hour day that has elapsed.


В приложении полная статья по типу TDateTime из справки delphi 7.

Удачи!

Приложение:

Ответ отправил: Николай Владимирович / Н.В. (статус: Специалист)
Ответ отправлен: 25.01.2008, 16:45
Оценка за ответ: 3
Комментарий оценки:
Интересно - всетаки интересно из каких соображений исходили - Note: Delphi 1.0 calculated the date from year 1 instead of from 1899 -это переводится что в первой версии отчет велся с 1900 года?? не просто же так взяли и сменили отчет


Вопрос № 120.111
Здрасте! Нужно сделать проверку на наличие папки, и если она есть, то удалить её. Спасибо заранее!
З.Ы. У меня Delphi 7.
Отправлен: 25.01.2008, 13:11
Вопрос задала: Екатерина Ходеева (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Drbear
Здравствуйте, Екатерина Ходеева!

Почитайте http://delphiworld.narod.ru/base/del_full_folder.html
там есть и другие варианты
Ответ отправил: Drbear (статус: 6-ой класс)
Ответ отправлен: 25.01.2008, 13:28
Оценка за ответ: 5
Комментарий оценки:
Спасибо Огромное! Это то, что надо!

Отвечает: Raptor3
Здравствуйте, Екатерина Ходеева!

1. DirectoryExists - проверка на наличие каталога
2.RemoveDirectory - удаление тока пустой папки
3. приложение - удаление каталога с файлами и со вложенными папками

Приложение:

---------
Программист - это человек который решает проблему, о которой вы не знаете, способом который вы не понимаете

Ответ отправил: Raptor3 (статус: 4-ый класс)
Ответ отправлен: 25.01.2008, 13:43
Оценка за ответ: 5
Комментарий оценки:
Спасибо за столь оригинальное решение! Но я похожее где-то встречала. Если вас не затруднит, объясните всё в мини-форуме.

Отвечает: Дегтярев Антон Александрович
Здравствуйте, Екатерина Ходеева!
использовать модуль ShellApi

Вызываем стондартную процедуру на определение есть ли данная папка
Если есть то вызываем вторую процедуру удаления
Если нет то сообщаем что папки нет

procedure TSms.SendBtnClick(Sender: TObject);
var
whey: string;
begin
whey := 'путь до папки';
if DirectoryExists(whey)
then DelDir(whey)
else ShowMessage('данная папка отсутствует');

end;
function TSms.DelDir(dir: string): Boolean;

{ Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay}

var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_DELETE;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
pFrom := PChar(dir + #0);
end;
Result := (0 = ShFileOperation(fos));
end;
---------
Все грибы съедобны, но некоторые - только раз в жизни
Ответ отправил: Дегтярев Антон Александрович (статус: 4-ый класс)
Ответ отправлен: 25.01.2008, 14:07
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое! Первый вариант, в принципе подходит. Второй мне известен, но он, к сожалению, не работает. Хорошо, когда человек пишет то, что знает, а не посылает к какой-нибудь статье, т.к. очень часто так ничего не понятно и ничё не работает. Спасибо, целую!

Отвечает: Marked One
Здравствуйте, Екатерина Ходеева!
В приложении рабочий код.
Использованны функции:

1) function DirectoryExists(const Directory: string): Boolean; {Объявленна в модуле SysUtils. Возвращает True если папка существует и False если её нет.}

2) function RemoveDir(const Dir: string): Boolean; {Объявленна в модуле SysUtils. Если папка успешно удалена, то функция вернет True, если неуспешно, то False}

Приложение:

Ответ отправил: Marked One (статус: 3-ий класс)
Ответ отправлен: 25.01.2008, 19:00
Оценка за ответ: 5
Комментарий оценки:
Огромнейшее вам спасибо! Самый лаконичный, но зато точный, и главное рабочий код!

Отвечает: Genia007
Здравствуйте, Екатерина Ходеева!

if not DirectoryExists('E:proba') then exit\ Если есть папка, то выход
else
if not RemoveDir('E:proba') then showmessage('Ошибка удаления папка не пуста');\ Удаляет пустую папку, если папка не пуста, возвращает false
Чтобы удалить вложенную папку процедура RmDir(s:string).
Ответ отправил: Genia007 (статус: 5-ый класс)
Ответ отправлен: 27.01.2008, 15:12
Оценка за ответ: 4
Комментарий оценки:
Пожалуйста внимательно следите за тем, что пишите.
If not DirectoryExists(E:Proba) then exit //если ПАПКИ НЕТ, то выход
А так вроде всё нормально. Спасибо!


Вопрос № 120.128
Здравствуете!
Подскажите, плиз, как мне сделать в функции проверку в строке 6: если пользователь ввел не 1 символ, а два или вообще его не ввел, то вывести результат = 0. Со String все получается, а как это делается с Char?

Приложение:

Отправлен: 25.01.2008, 15:15
Вопрос задала: Kollisto (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: BlackRaider
Здравствуйте, Kollisto!

На самом деле с Char все еще проще, на то он и Char т.е. не символ!
Туда 2 символа ни как не передать!

но если уж очень хочется то можете сделать так
описываем переменную типа txt:string ;
и с 5 строчки добавляем :
txt:='';
txt:=txt+ch;
if (length(trim(txt))<>1 then begin Result:=0;exit;end;

но повторюсь вы в переменную типа char не сможете запихать более 1 символа
Ответ отправил: BlackRaider (статус: 2-ой класс)
Ответ отправлен: 25.01.2008, 15:28
Оценка за ответ: 5

Отвечает: Зиновьев Дмитрий Владимирович
Здравствуйте, Kollisto!
Дело в том, что char подразумевает под собой хотя бы один символ... Если он не введен, то он равен #0, в противном случае он введен. Вот и делайте проверку:
if ch = #0 then begin result := 0; exit; end; А два символа в один никак не попадут.
Ответ отправил: Зиновьев Дмитрий Владимирович (статус: 9-ый класс)
Ответ отправлен: 25.01.2008, 17:53
Оценка за ответ: 4

Отвечает: Маренич Владимир
Здравствуйте, Kollisto!

На самом деле переменные типа Char не могут НЕ СОДЕРЖАТЬ значения. Это всегда ОДИН символ с кодом от 0 до 255. Можно только проверять содержимое с каким-либо значением (напрмер, if ch=#0 then Result:=0). А при преобразовании Char к типу String Вы получите всегда строку длиной в один символ.
Думаю в Вашем случае нужно вместо Char использовать String, т.к. предполанаю, что при вводе используется компонент TEdit.

Приложение:

Ответ отправил: Маренич Владимир (статус: Студент)
Ответ отправлен: 25.01.2008, 17:58
Оценка за ответ: 5


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

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


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.70 от 17.01.2008
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное