Здравствуйте! В работающем проекте открываю файл *.docx, у которого есть картинки, компонентом WebBrowser из библиотеки Internet. Открывается в оболочке Word 2007 и в процессе открытия появляется окно MS Word ошибки - "неверно указана еденица измерения", но ее я не задавал. После нажатия ОК файл открывается нормально и с ним можно делать все, что хочешь, хотя мне нужно чтобы он только читался. Что нужно для этого сделать и где можно об этом почитать? Можно ди спрятать оболочку Word 2007?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
22-01-2010 04:43 | Комментарий к предыдущим ответам
Жуть во оффтоп мощный, началось с Ворда, вылелось в воспроизведение файлов...
Слов нет, модераторы мое сообщение тоже оффтоп в принципе, можно удалять, просто не сдержался...
Направил "фрагмент предисловия.docx" для размышления. Обратите внимание на P.S. в конце фрагмента. Ссылка: http:\\siil.ru/28065679. Жду Ваше мнение по этому вопросу.
Огромное спасибо! Всё полочилось. Раньше не мог понять эти значения в полях "Перед" и "После" и мучился с ними, но теперь разобрался. Поменял во всех исходных 12 главах и полный порядок. Немного жалко, но больше по этой теме вопросов нет. Займусь ликбезом по теории и может быть придумаю что-то ещё. Как мне Вас найти если возникнет необходимость?
Разобрался, у вас в документе установлен интервал между абзацами, поставьте значение 0 в поля "Перед" и "После", и заново установите межстрочный интервал.
Не знаю как работает этот сайт.
Выбираете файл, отправляете его и вам даётся ссылка (вида: http://slil.ru/5422452), по которой можно скачать этот файл с их сервера. Мне необходима ссылка.
Не знаю как работает этот сайт. Вчера вечером сделал выкопировку из текста в word 2007 (в блокноте пишет как в оригинале исходного текста) и отправил - "Фрагмент текста.docx". Не знаю дошёл ли? Номер не записал, нужен ли он?
С этой галочкой я создавал все тексты. В ней возникла необходимость когда писал тексты диалогов слева на французском, а справа перевод на русский и надо было,чтобы предложения не перехлестывались. Потом при форматировании использовал её к другим частям текстов. Наверно дело не в ней?
Попробуйте в Word'е выделить весь текст и установить галочку "Не добавлять интервал между абзацами одного стиля" (есть только в 2007 версии, в том же окне "Абзац").
Вставил код соответственно указаниям в одну форму, ругнулся, добавил RichEdit в Eses и скомпилировался. Открыл текст формы, но межстрочный интервал остался искаженным в тех местах, как в первонвчальном варианте. Не могли ведь символы языка текстов (у меня французские и русские) повлиять на интервалы при открытии текста в программе?
...
RichEdit1.Lines.LoadFromFile(fileName);
//вставляете эту процедуру после открытия файла
RELineSpace(RichEdit1.Handle, 1); // где "1" это будет величина интервала (указываются только целые числа)
...
Ещё раз благодарен за плодотворное и полезное общение по решению сложных для меня вопросов. Проект практически готов и буду потихоньку заниматься его украшательством. Если будет какая-нибудь информация по межстрочным интервалам, готов опровать её в рабочем варианте. Желаю Вам удачи.
Весьма признателен. Отлично! А ларчик-то просто открывался. Век живу, век учусь. Со ShowModal не проходит - пропадает картинка плеера. Внесу изменения во все формы и подумаю как сделать так, чтобы кнопки были invisible, и была бы была только картинка плеера. О результатах сообщу.
Может я путаю желаемое с возможностью?
Ну что вы :-) возможности здесь ограничиваются лишь фантазией. Предлагаю вариант:
//Допустим у вас три процедуры:
procedure TForm3.Button1Click(Sender: TObject);
begin
//"Возврат в оглавление"
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
//"Открыть текст Главы.."
end;
procedure TForm3.Button3Click(Sender: TObject);
begin
//"Установить плеер"
end;
...
//эта процедура, предположем, открывает новую форму
procedure TForm1.Button0Click(Sender: TObject);
begin
Form3.Button2.Click; //открыли текст главы
Form3.Button3.Click; //открыли плеер
Form3.Show; //открыли саму форму
//кстати, а не лучше ли будет "Form3.ShowModal"?
end;
Спасибо. Попробовал, срабатывает, возьму на вооружение. Если можно, вот такой вопрос: из главной формы Form1 открываю форму любой главы кодом:
//переход из оглавл. к форме главы 1 (кнопка Глава1)
procedure TForm1.Button2Click(Sender: TObject);
begin
//операция с третьей формой
Form3.Show; //открывается форма для Главы 1 и т.д.
end;
На открывающейся форме три кнопки: "Возврат в оглавление", "Открыть текст Главы..", "Установить плеер" и поле RichEdit1 для текста. Нажав кнопки, открываю текст, устанавливаю плеер, всё работает и по оканчании - закрываю плеер и перехожу в оглавление. Явно лишние шаги, а как сделать так, чтобы из главной формы открывалась допустим Form3 с уже открытым текстом и установленным плеером не могу сообразить. Тогда на форме не будут нужны видимые кнопки - достаточно будет закрыть плеер и закрыть саму форму для возврата в оглавление. В коде они конечно останутся,но командовать ими надо из Form1. Может я путаю желаемое с возможностью?
Попробовал для Form3 в Event в сторке OnCloseQuery вписал RichEdit1.Clear. и при переходе в код выдаёт в середине экрана окошко: Error: 'RichEdit1.Clear' is not a valid identifier OK Help.
В самой строке OnCloseQuery писать не надо, просто два раза кликаете по этой строке, и среда Delphi автоматически вписывает обработчик OnCloseQuery в сам код, а уже в сам обработчик и вставляете RichEdit1.Clear;
procedure TForm1.RichEdit1Change(Sender: TObject); // <- автоматически вставится
begin // <- автоматически вставится
RichEdit1.Clear; // <- сюда вписываем сами
end; // <- автоматически вставится
Попробовал для Form3 в Event в сторке OnCloseQuery вписал RichEdit1.Clear. и при переходе в код выдаёт в середине экрана окошко: Error: 'RichEdit1.Clear' is not a valid identifier OK Help. В Help-е говорится о правилах написания. При такой конструкции они не нарушены, но как говорится в программе "Время" Однако...? Непосредственно для моего ПК это не имеет значения, памяти хватает и не тормозится, но опробовал диск на Notebook-е друга и чувствовалась перегрузка памяти. Всвязи с эти и возник вопрос.
Как проверить, удаляется ли предыдущий текст из памяти после открытия следующей главы и как сделать так, чтобы память очищалась?
Достаточно будет, вписать в событие формы FormCloseQuery, очистку RichEdit1.Clear.
При открытии текста в программе, интервал самопроизвольно меняется в различных местах, что не очень удобно при прокрутке текстов.
Подумаю...
Компановка и прогон проекта завершены успешно. Теперь в нем 4 папки, файл AudioPlayer.pas и 16 Форм вместо 5-ти прежних. Работать так удобнее, хотя будут изменения. Текстовые файлы в каждой главе открываю кодом:
procedure TForm3.Button2Click(Sender: TObject); //и т.д. до Form16
var
fileName:String;
begin
FileName:= ExtractFilePath(Application.ExeName)+'GLVZ\Глава1.rtf';//и т.д. до Гл.12
RichEdit1.Lines.LoadFromFile(fileName);
end;
end.
Все тексты Глав набирал в Word2007 и интервал задал для всего текста 1. При открытии текста в программе, интервал самопроизвольно меняется в различных местах, что не очень удобно при прокрутке текстов. Где можно почитать о приёмах сохранения перврначальных интервалов? Порылся в статьях сайта - кроме "Работа с файлами Паскаля" А. Подгорецкого ничего не нашёл, но она не в масть. Как проверить, удаляется ли предыдущий текст из памяти после открытия следующей главы и как сделать так, чтобы память очищалась?
Как я могу выразить мою благодарность именно Вам за оказанную помощь, чтобы об этом узнали в "Королевстве"?
Собственно мне и вашей благодарности достаточно, а то что другие знают или нет - мне всё равно, богаче или беднее я от этого не стану :-)
Не перестаю каждый раз удивляться на неожиданные изменения после казалось бы незначительных перемен. Открывал текст в Form3 :
procedure TForm3.Button3Click(Sender: TObject);
var
Otkr:TFileStream;
begin
if OpenDialog1.Execute
then
Otkr:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
RichEdit1.Lines.LoadFromStream(Otkr);
FreeAndNil(Otkr);
RichEdit1.ReadOnly:=true;
end;
При этом и была "заковырка" последовательности открытия. Решил делать для каждой Главы свою форму и уйти от OpenDialog. Написал:
procedure TForm3.Button4Click(Sender: TObject);
var
fileName:String;
begin
и "заковырка" исчезла. Можно открывать в любой последовательности. Не понял почему так было, ну и пусть. Завтра буду вносить изменения в проект. О непонятках буду спрашивать, понял, что можно.
Как я могу выразить мою благодарность именно Вам за оказанную помощь, чтобы об этом узнали в "Королевстве"?
Прогон показал, что у плеера есть заковырка. Если на Form3 сначала установить плеер, а затем открыть текст, то всё работает. Но перегрузив проект и сначала открыть текст, а потом нажать "Установить плеер", то посередине экрана появляется окно: Ошибка: Системе не удаётся найти указанный путь ОК.
Поставил курсор в коде Form3 перед OpenAudioPlayer('Zvuk\Sound1.wav', 'Sound1', True); и нажал Ctrl+F5. В окне WatchList запись: OpenAudioPlayer: [process not accessible]. Перед ней квадратик с галочкой внутри. Листая по F7, путешествовал по пяти формам останаливаясь на последнем end;, открылся код AudioPlayer, дошёл до раздела Project1 и зелёная стрелка всала напротив Application.Initialize;, затем Application.CreateForm(TForm1, Form1); открыв пустую форму с дырками и только после Application.Run; открылась Главная форма (Form1).Что-то не так?
Сделал как сообщил раньше и нажал Ctrl+F5. Никакой реакции. Foem3 остаётся на месте.
Form3 и должен оставаться на месте, а должно появиться окно "Watch List", в котором будет отображаться значение переменной (той которую мы выделили перед нажатием), потом пошагово (по F7) дойдите до процедуры OpenAudioPlayer и посмотрите какое значение у переменной (в которой содержится путь к файлу)... если конечно вы не напрямую указывали путь:
Alt+F4
Вот я советчик ;-) Простите, голова не тем была забита, нужно жать Ctrl+F5, а Alt+F4 закрывает активное окно.
Не компилируется и ошибка:[Fatal Error] Could not create output file 'D:\Проекты учебника\textbook\Project1.exe'.
Если такое случается, сохраняете и закрываете проект, а потом в диспетчере задач находите процесс "Project1.exe" и убиваете его.
then
Otkr:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
RichEdit1.Lines.LoadFromStream(Otkr);
FreeAndNil(Otkr);
RichEdit1.ReadOnly:=true;
RichEdit1.Clear; <- вот сюда
end;
end.
Не компилируется и ошибка:[Fatal Error] Could not create output file 'D:\Проекты учебника\textbook\Project1.exe'. Похоже промахнулся? Не может создать выходной файл, а развеон нужен?
Загрузил проект- Project1.exe, открывается главная форма- Form1 с оглавлением, нажал "Глава 1", открылается форма с тремя кнопками (Form3), нажал Alt+F4 - перешёл в Глпвную форму. Это сделал, или надо что-то в коде?
Поставил True и всё отлично. Щшибка возникала наверно потому, что плеер устанавливался на поле RichEdit1, а когда встал в верхний правый угол, то всё ОК.
Просто если True - форма открывается так "FormAudio.Show", а если False - "FormAudio.ShowModal".
Открыв другую форму в компоненте RichEdit1 соханен предыдущий текст.
Пробовал:
//Операция с первой формой
Form1.Show;
Form3.Close;
end;
Все не главные формы, при закрытии просто скрываются (а не закрываются), используйте "RichEdit1.Clear" для очистки содержимого RichEdit1.
Прогон показал, что у плеера есть заковырка. Если на Form3 сначала установить плеер, а затем открыть текст, то всё работает. Но перегрузив проект и сначала открыть текст, а потом нажать "Установить плеер", то посередине экрана появляется окно: Ошибка: Системе не удаётся найти указанный путь ОК. Нажав ОК, плеер появляется в правом верхнем углу, но нажав "Воспроизведение", появляется только общее время 00:12:51, кнопка обесцвечивается, но файл не озвучивается. Странная последовательность?
Посмотрите в отладке, перед самим открытием плеера, что у вас содержится в путе (выделяете переменную, Alt+F4, появляется окно).
Прогон показал, что у плеера есть заковырка. Если на Form3 сначала установить плеер, а затем открыть текст, то всё работает. Но перегрузив проект и сначала открыть текст, а потом нажать "Установить плеер", то посередине экрана появляется окно: Ошибка: Системе не удаётся найти указанный путь ОК. Нажав ОК, плеер появляется в правом верхнем углу, но нажав "Воспроизведение", появляется только общее время 00:12:51, кнопка обесцвечивается, но файл не озвучивается. Странная последовательность?
Поставил True и всё отлично. Щшибка возникала наверно потому, что плеер устанавливался на поле RichEdit1, а когда встал в верхний правый угол, то всё ОК. Буду заниматься прогонами, другими Главами и офрмлением. Если возникнут вопросы не только по плееру, можно ли задать их? Например: тексты Глав, открывающиеся в RichEdit1 большие до 13 мин. озвучивания и загружаются:
Здесь заканчивается и сам код Form3. Закончив с одной главой, нажимаю кнопку "Возврат в оглавление":
procedure TForm3.Button5Click(Sender: TObject);
begin
//Операция с первой формой
Form1.Show;
end;
Открыв другую форму в компоненте RichEdit1 соханен предыдущий текст. Через компонент OpenDialog1 текст меняется, но память-то наверное съедается? Пробовал:
//Операция с первой формой
Form1.Show;
Form3.Close;
end;
текст остаётся. Возможно я заблуждаюсь насчёт памяти (ведь есть FreeAndNil(Otkr); , а если нет, то что надо написать и где? Ещё раз благадарю Вас за плеер. Если будут вопросы, надеюсь они дойдут до Вас?
01-10-2009 06:56 | Комментарий к предыдущим ответам
//вот так будет в правом верхнем углу
OpenAudioPlayer('C:\textbook\Глава 1.wav', 'Глава 1', True);
//а так посередине (и пока окно плеера не закроется, выполнение кода не продолжется)
Забыл дописать:
Искал в AdioPlayer.pas WindModal, но не нашёл там ни True ни False if not WindModal then
равносильно if WindModal=False then
Картинка плеера открывается по середине экрана монитора и сразу начинается воспроизведение. Её можно передвинуть, луше бы в верхнем правом углу.
//вот так будет в правом верхнем углу
OpenAudioPlayer('C:\textbook\Глава 1.wav', 'Глава 1', True);
//а так посередине (и пока окно плеера не закроется, выполнение кода не продолжется)
Или вы что-то другое имеете ввиду?
если открыть текст, то картинка открывается через ошибку
Так, поподробнее.
Очередная благодарность и поздравление с успехом. Вам удалось додолбить этот вопрос до конца. Снова, не спеша прокрутил всё со своим проектом и ОК. На Form3 у меня три кннопки: "Возврат в оглавление" для выбора главы, "Открыть текст" в компоненте Edit1 на этой форме и соответственно "Установить плеер". Картинка плеера открывается по середине экрана монитора и сразу начинается воспроизведение. Её можно передвинуть, луше бы в верхнем правом углу. Искал в AdioPlayer.pas WindModal, но не нашёл там ни True ни False. Если есть картинка плеера, то не открывается текст, и наоборот, если открыть текст, то картинка открывается через ошибку, а кнопка "Воспроизвести" не работает. Вероятно эта ситуация исправима?
Всё на месте. Теперь курсор встал в Project1.dpr после: Application.Create(TFormAudio, и сообщение:[Error] Project1.dpr(12): Incompatible types: 'TComponent' and 'Class reference'. Написано как Вы рекомендовали. В чём несовместимость?
Добавил строки в Project1.dpr. Курсор встал после: OpenAudioPlayer= и сообщение: [Error] Unit1.pas(21): Not enough actual parameters. Окуда должны взяться эти актуальные параметры?
File not found: 'AudioPlayer.dcu' AudioPlayer.dcu - это скомпилированный AudioPlayer.pas, вы его (а также AudioPlayer.dfm) не забыли скинуть в папку с новым проектом?
P.S. и использовать (например) здесь:
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenAudioPlayer=('C:\textbook\Zvuk\Глава1.wav','Глава 1', False);
//при нажатии на кнопку, должен открыться плеер
end;
Извиняюсь, случайно нажал отправить. При компиляции курсор застревает после .wav и даёт:[Error] Unit3.pas(9): Identifier expected but string constant found. Какой ему нужен идентификатор?
Весьма признателен за труды - плеер компактный приятно смотрится, но не получается с его установкой. Распаковал в проект, записал строки в Project1.dpr, из Form3 (где должен быть плеер) убрал все компоненты, предполагая что при компиляции код AudioPlayer-а сам установится на форме:
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, XPMan, ActiveX, AudioPlayer,
DirectShow9;
type
TForm3 = class(TForm);
implementation
{$R *.dfm}
procedure OpenAudioPlayer(Sender: TObject);
<- сюда begin
end;
end.
Получаю ощибку:[Error] Unit3.pas(13): BEGIN expected but END found и вторая строка [Fatal Error] Project1.dpr(8): Could not compile used unit 'Unit3.pas'. Фантазировал, но без толку. Возможно надо писать, а что не знаю.
Пробовал установить компоненты плеера на Form3 (куда Button4 и Button5 ?) и скопировать код AudioPlayer.pas с заменой FormAudio не Form3 - всё мимо. Где-то я почитывал,что можно всталять код из .pas файла. Что мне нужно делать?
Постойте, я подготовил новый проект, который существенно (как я надеюсь) облегчит вам работу, сначала качаем архив: http://file.sibnet.ru/get/file/?id=696586
и распаковываем файлы в каталог с проектом, далее открываем "Project1.dpr" и вносим туда две строчки:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
... AudioPlayer in 'AudioPlayer.pas';{<- вот сюда}
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
... Application.CreateForm(TFormAudio, FormAudio);{<- и вот сюда}
Application.Run;
end.
Теперь в нужной форме (той, откуда надо открывать плеер) вписываем в Uses модуль AudioPlayer и вызываем процедуру OpenAudioPlayer, ну и собственно всё :)
Параметры OpenAudioPlayer: PathMusic - путь к звуковому файлу; StrCaption - название в заголовке окна (можно указать '', тогда заголовок будет пустым); WindModal - если True - окно плеера будет открыто модально (другие окна будут недоступны), False - и наоборот, окно будет открыто в верхнем правом углу и поверх всех окон (т.е. можно будет слушать файл и одновременно читать текст).
P.S. в качестве бонуса, прикрутил к плееру регулировку громкости :)
Кажется разобрался с путями. Лучше писать например Sound1.wav чем Глава1.wav - точки-то на клавиатуре имеют разные коды, а какую поставил в Главе не помнишь. Так похоже файл и теряется. Осталось решить вопрос с изменением позиции воспроизведения и можно подумать о возврате к 16-ти формам (для кахдой главы своя форма) как было у меня первоначально. Придётся много копировать кодов, но зато удобно в работе. Если не трудно, то хотелось бы получить подсказку.
Спасибо за Смайлики! Весьма забавно. Сделаю словарик. Вот мои последнии попытки - снова из net-а взял пример,внёс рекомендованные изменения только:
if GraphBuilder.RenderFile(PWideChar(WideString(Path)), nil)<>S_OK then
begin
ShowMessage('Ошибка');
Exit;,
function GetAudioPos(out StrPos: string; out IntPos: integer):boolean;
var
CurrPos: Int64;
Value, H, M, S: integer;
begin
Result:=False;
StrPos:='';
IntPos:=0;,
procedure SetAudioPos(IntPos: Int64);
var
CurrPos: Int64;
begin
if MediaSeeking=nil then
Exit;, и
AudioStop(Str, Int);
Label1.Caption:=Str; //вот здесь обнудяется общее время
Label2.Caption:=Str;
SendMessage(TrackBar1.Handle, WM_USER+5, 1, Int);
end;
В строку Edit1 записал Zvuk\Глава1.wav. Скомпилировал, сохранил в папке proigr, и дабавил папку Zvuk. Работает отлично! Сделал распечатку кода для контроля.
На Form3 моего проекта разместил компоненты proigr и скопировал его код, заменив в нём Form1 на Form3 и проверил код после копирования. Скомпилировался, Form3 открылась, файл Глава1.wav озвучивается, общее время показывает и обнуляется при "стоп", а текущее время на 00:00:00 и при паузе движок времени перемещается, но на Label2 00:00:00, а продолжается воспроизведение с момента остановки. В чём причина? Сам процесс копирования или что-то ещё?
Но вожможно автор не думал о том, что кто-то вроде меня захочет использовать проект не по прямому назначению, а в сосотаве другого проекта, и не подумал о возможных затруднениях, вызывающих у Вас недоумение, а у меня непонимание.
Хмм... попробую переработать проект, для более легкого "внедрения".
Кстати, что означают в тексте значки типа о_О, :)), :), ;-)? Если Вы меня поругиваете, то я всё равно не понимаю.
Ну что вы :) совсем наоборот: http://ru.wikipedia.org/wiki/Смайл
Ни коим образом не хотел Вас в чём-то заподозрить. Пример как отдельный проект работает и говорил об этом неоднократно. Но вожможно автор не думал о том, что кто-то вроде меня захочет использовать проект не по прямому назначению, а в сосотаве другого проекта, и не подумал о возможных затруднениях, вызывающих у Вас недоумение, а у меня непонимание. К этому выводу приводят предложенные Вами изменения и дополнения в коде после моих неудачных попыток. Кстати, что означают в тексте значки типа о_О, :)), :), ;-)? Если Вы меня поругиваете, то я всё равно не понимаю. И опять древний вопрос - Что делать?
И так ясно, что откроется и озвучится, если в системе установлен проигрыватель Windows Media. Не понял цель такой проверки.
Цель заключалась, в проверки правильности путя, т.к. "PlayButton('C:\textbook\Zvuk\Глава1.wav')" показывает "Системе не удаётся найти указанный путь", а вставка "C:\textbook\Zvuk\Глава1.wav" в Explorer открывает этот файл, то я в недоумении о_0
А не подложил ли автор проекта http:\\file.sinet.ru/get/file/?id=678034 маленького поросёночка большим дядям? Разве правильно так писать:
//MediaControl.Run;
except
ShowMessage('Ошибка');
end;
end;
хотя он компилируется и озвучивает файл загрузки ХР?
Это какого поросёнка, я хотел спихнуть :)) Я немного в замешательстве :)
Вас удивляет, что при за комментированной строчке //MediaControl.Run;
файл чудесным образом воспроизводится? Просто в том варианте, после процедуры AudioRun вызывается другая процедура AudioStartPause, в которой и находится MediaControl.Run.
И так ясно, что откроется и озвучится, если в системе установлен проигрыватель Windows Media. Не понял цель такой проверки. Любой файл с расширением *.wav будет проигрываться.
Как было раньше рекомендовано integer заменен на Int64 в:
procedure SetAudioPos(IntPos: Int64);
var
CurrPos: Int64;
begin
if MediaSeeking=nil then
Exit;
А не подложил ли автор проекта http:\\file.sinet.ru/get/file/?id=678034 маленького поросёночка большим дядям? Разве правильно так писать:
появляется окно ошибки -"Не возможно найти указанный файл ОК"
И впрямь чертовщина?
Откройте "Мой компьютер" (explorer) и в верхнее поле "адрес", вставьте "C:\textbook\Zvuk\Глава1.wav", далее Enter и если Глава1.wav откроется - будет и впрямь чертовщина о_0
Глава1.wav озвучивается, а движок бара воспроизведения застревает, как было вначале, хотя все исправления в код внесены, проверял по распечатке для верности
Проверьте по точнее, сам я уже не помню, в каком то месте должен быть Int64 вместо Integer.
procedure TForm3.Button1Click(Sender: TObject);
begin
PlayButton('C:\textbook\Zvuk\Глава1.wav');
end;
компилируется, но после запуска, перехода в Form3 и нажатия Button1 появляется окно ошибки -"Не возможно найти указанный файл ОК". Кажется по такому адресу и в темноте должно что-то отыскаться, днако ...?
Попробовал ещё вариант проекта vers1: скопировал 5 моих рабочих форм, на Form3 разместил Primer1 и добавил только одну папку Zvuk, скомпилировался, Глава1.wav озвучивается, а движок бара воспроизведения застревает, как было вначале, хотя все исправления в код внесены, проверял по распечатке для верности. И впрямь чертовщина?
Проект для проверок вариантов находится на системном диске C:\ в папке "textbook". В ней находятся папки: GLVZ-с текстами глав *.rtf, Zvuk-со звуковым сопровождением текстов *.wav, player-специально для плеера AIMP2, Songs-с песнями на французском языке для отдыха и,естественно, Project1.exe для старта программы со всеми причиндалами 5-ти форм, из которых и сосотоит сам проект и полностью повторяет Работающий проек, который храню на диске D:\ и на всякий случай на CD- 298 МБ . С путями кажется всё на месте, а пробный плеер Primer1 (отдельно работющий с папкой Zvuk в его составе) при установке его на форму 3 после компиляции и старта проекта дает ошибки, упомянутые ниже. Хоть я совсем начинающий школяр в Delphi, но сдаётся мне, что здесь какая-то несовместимость. Может оставить всё как есть? Знакомые, смотревшие мое пособие отзываются положительно да и мне на старости лет интересно поупражняться французским яыком с нудя. Но есть ещё тяга к улучшению уже сделаного. Вот в чём вопрос. И какой будет ответ?
Значит действительно проблема с путями, проверьте точно, как располагаются файлы и правильные ли пути указываются.
Куда вставить полный путь -GetCurrentDir+'\Zvuk\Глава1.wav'? GetCurrentDir - функция, возвращающая текущий каталог, т.е. тот из которого произведён запуск программы.
"GetCurrentDir+'\Zvuk\Глава1.wav" - по такой схеме, в каталоге, откуда стартовала программа, должна находится папка "Zvuk", а в ней уже файл "Глава1.wav", измените схему для своего расположения файлов.
Вставил GetLastError, компилируется без ошибки, а при открытии на форме дает ошибку: "Не удаётся найти указанный файл ОК". Куда вставить полный путь -GetCurrentDir+'\Zvuk\Глава1.wav'? Вставил в :
procedure TForm3.Button1Click(Sender: TObject);
begin
PlayButton(GetCurrentDir+'\Zvuk\Глава1.wav');
end;
показывает на форме ошибку: "Системе не удаётся найти указанный путь ОК".
Ага, значит проблема всё-таки в "Глава1.wav", либо не удаётся его найти, либо он некорректен, посмотрите что пишет GetLastError, вот это:
if GraphBuilder.RenderFile(PWideChar(WideString(Path)), nil)<>S_OK then
begin
ShowMessage('Ошибка'); //ошибка открытия файла (возможно он не найден)
Exit;
end;
изменяем на:
if GraphBuilder.RenderFile(PWideChar(WideString(Path)), nil)<>S_OK then
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
А вообще, лучше использовать полные пути, вместо относительных:
Внёс изменения. При прогоне Primer1 по F7 на Exit не попадаю а "заикание" началось в процедуре:
procedure GetAudioCount(out StrCount: string; out IntCount: integer);
var
DurPos: Int64;
Value, H, M, S: integer;
begin
<<вот здесь>>StrCount:='';
IntCount:=0;
Сам пример по-прежнему работает. В рабочем проекте прогон по F7 закончился в:
procedure AudioRun(Path: string; CHWND: HWND);
в измененной строке:
if GraphBuilder.RenderFile(PWideChar(WideString(Path)), nil)<>S_OK then
begin
<<вот здесь>>ShowMessage('Ошибка'); //ошибка открытия файла (вожможно он не найден)
Exit;
end;
Папка Zvuk в обоих вариантах находится в корнях проектов. В первом Глава1.wav открывается и звучит, во втором после главной формы в форме где плеер, при нажатии кнопки:
procedure TForm3.Button1Click(Sender: TObject);
begin
PlayButton('Zvuk\Глава1.wav');
end;
показывает "Ошибка". Почему? Что-то не так с указанием пути? Всё сделано под копирку.
Что бы это могло означать?
Чёрт его знает ;-| Прогоните по F7 процедуру AudioRun, не попадаем ли мы, там, на "Exit" (то что проскакиваем "if CHWND<>0 then" - это нормально), а лучше - вообще замените все Exit'ы на:
begin
ShowMessage('Ошибка');
Exit;
end;
Заменяйте только в тех местах, где нет условия:
if ...=nil then
//или
if ...<>nil then
И ещё, небольшие подправления:
- в процедуре AudioRun, найдите строчку "GraphBuilder.RenderFile(PWideChar(WideString(Path)), nil)" и замените на:
if GraphBuilder.RenderFile(PWideChar(WideString(Path)), nil)<>S_OK then
begin
ShowMessage('Ошибка'); //ошибка открытия файла (возможно он не найден)
Exit;
end;
- в процедуре PlayButton, найдите строчку "MediaControl.Run" и замените на:
Спасибо за Ctrl+F2. Заставили снова регистрироваться и подготовленный ответ исчез. А суть его в том, что в рабочем проекте в отличие от Primer1 курсор с позиции:
procedure TForm3.Button1Click(Sender: TObject);
begin
>>вот сюда<< PlayButton('Zvuk\1.wav');
end;
нажатием F4 сначала открывает главную форму проекта Form1 и после перехода к форме, где есть плеер (Form3) и её закрытия, передвижение by F7 никакого звука или "заикания" не обнаруживает. Что бы это могло означать?
Извиняюсь за "ядро" - это только моё предположение. Начал проверку с работающего проекта Primer1. Установил курсор в указанное место и нажал F4 или Run to cursor. Открылась форма плеера и запустил воспроизведение. При пошаговом передвижении by F7 зелёной стрелки, на строке:
MediaSeeking.GetDuration(DurPos);
началось прослушивание заикающегося воспроизведения и это "Duration-продолжение" может длится до бесконечности. Выйти можно только через Close All и на сообшение "Debug session in progress. Terminate?" ответить ОК. Тоже самое с добавленым работающим примером к моему проекту, где Form3 открывается, а звука нет. Замаялся, но не понял суть всей процедуры, хотя сам проект Primer1 отдельно работает. Может что-то не так?
Первоначалоно рекомендованный пример плеера с Вашей помощью удалось довести до ума. Нажодится в папке primer1, содержит: Папку "Zvuk", Project1.exe, Project1,~dpr, Unit1.pas и всё остальное, что положено любому готовому проекту. Он работает - запустив ехе-шнние, открывается форма плеера, нажав "открыть аудио файл" озвучивается файл указанный в пути:
//а используете так:
procedure TForm1.Button1Click(Sender: TObject);
begin
PlayButton('Zvuk\1.wav');
end;
Всё путём! Взял из своего работающего проекта две главных формы, соэдал новый проект, влкючил в него папаку "Zvuk", добавил в него пустышку Form3, поместил на неё все компоненты плеера из примера и скопировал код Unit1.pas. Проект компилируется, Form3 открывается, плеер на ней находится, а файл 'Zvuk\1.wav' не воспроизводится.
Если в этот новый проект добавить папку primer1, а на пустушку Form3 поместить кнопку "установить плеер" и прописать ей:
procedure TForm3.Button1Click(Sender: TObject);
begin
WinExec(PChar(ExtractFilePath(Application.ExeName)+
'primer1\Projecr1.exe'),0);
end;
то всё ОК. Компилируется, открывается и файл 'Zvuk\1.wav' озвучивается.
Очевидно, в последнем случае ядро управления плеером нажодится на Form3, а в предыдущем оно теряется. Где-то про ядро я видел, кажется в книге Джеффри Рихарда "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows", но я на 64-разрядную не переходил.
Эта ситуация полностью повторяет мой рабочий проект, где использую плеер AIMP2. А хотелось бы .....,да видно не получится? А вдруг?
Создаю новое приложение, включаю в него Unit главной формы из моего работающего проекта, открываю новую форму (допустим Form2) и кладу на неё Unit из примера проверенного примера плеера со всеми причиндалами. Сохраняю как новый проект и он успешно компилирется. Открываю этот проект - главную форму, щелкаю по главе в которой содержится аудио-файл, открывается Form2 со всеми параметрами плеера (как отдельный проект он работает), а запусть тот жк самый файл не удается.
Что то я запутался, в смысле "запусть тот жк самый файл не удается"? У вас же проект компилируется? При открытии файла ошибок тоже нет? Значит вы упустили какую то деталь, посмотрите внимательно. Пройдитесь ещё отладкой по процедуре PlayButton'a.
Создаю новое приложение, включаю в него Unit главной формы из моего работающего проекта, открываю новую форму (допустим Form2) и кладу на неё Unit из примера проверенного примера плеера со всеми причиндалами. Сохраняю как новый проект и он успешно компилирется. Открываю этот проект - главную форму, щелкаю по главе в которой содержится аудио-файл, открывается Form2 со всеми параметрами плеера (как отдельный проект он работает), а запусть тот жк самый файл не удается. Если на Form2 сделать кнопку - "установить плеер" и назначить ей процедуру:
procedure TForm2.Button2Click(Sender: TObject);
begin
WinExec(PChar(ExtractFilePath(Application.ExeName)+
'player\AIMP2.exe'),0);
end;
то на форме устанавливается картинка плеера AIMP2, пердвигаю её в нужное место и он открывает любой аудио-файл. Сам фойл плеера находится в корне проекта. Вот что имел ввиду под фразой - запускать на этой форме через ехе-шник. А хотелось бы .....- как лучше, но не получается.
17-09-2009 04:36 | Вопрос к автору: запрос дополнительной информации
Как отдельный проект плеер работает, но создав его на отдельной форме проекта моего пособия, которая открывается из главной формы, заставить его воспроизвести файл не удается.
Странно, можно поподробнее.
Такое впечатление,что его нужно как отдельный проект запускать на этой форме через ехе-шник.
Да нет, можно и из проекта.
Компонент TLable1 присуствует и общее время показывает, а то, что не обнуляется так и пусть. Как отдельный проект плеер работает, но создав его на отдельной форме проекта моего пособия, которая открывается из главной формы, заставить его воспроизвести файл не удается. Такое впечатление,что его нужно как отдельный проект запускать на этой форме через ехе-шник. Это я уже делаю с плеером AIMP2, используя кнопку на форме для его установки и позиционированием его в нужное место. Он отлично работает, а хотельсь бы, чтобы при выборе очередной главы на главной форме для работы с ней открывалась форма с уже установленным на ней плеером в верхней части формы, открытым текстом этой главы в компоненте RichEdit1 и нажав кнопку типа "открыть аудио-файл" прослушивать его и работать с текстом. Уверен что это не благое пожелание, но с какой стороны к этому подбираться? С компонентом WindowsMediaPlayer это удается сделать, но как сообщал ранее RichEdit1 не прокручивает текст и искажения в картинке. В каком направлении покопаться?
Undeclared identifier: 'Lable1' - здесь надо кинуть на форму компонент TLable (с именем 'Lable1'), вообще в моём примере (проекте, который скидывал) два компонента TLable, в первый выводится общее время звучания, а во второй - текущее время воспроизведения.
Наверняка всплывут заковычки и с Вашего разркшения буду просить совета
Спрашивайте, поможем, чем сможем :)
Спасибо, изменение позиции воспроизаедения работает отлично, а обнуление дает ошибку -Lable1.Caption:=Str; //вот здесь обнуляется общее время -
[Error] Unit1.pas(247): Undeclared identifier: 'Lable1'. Пока убрал, это не столь важно. При переходе на другую главу будет свое общее время. Поупражняюсь с компонентом OpenDialog для выбора нужного файла для воспроизведения и уменьшения кол-ва форм, а затем займусь включением этого плеера в проект. Наверняка всплывут заковычки и с Вашего разркшения буду просить совета. Весьма признателен.
function GetAudioPos(out StrPos: string; out IntPos: integer): boolean;
var
CurrPos: Int64;
Value, H, M, S: integer;
begin
Result:=False;
StrPos:='';
IntPos:=0;
if MediaSeeking=nil then
Exit;
MediaSeeking.GetCurrentPosition(CurrPos);
Value:=Trunc(CurrPos/10000000);
H:=Value div 3600;
M:=(Value mod 3600) div 60;
S:=(Value mod 3600) mod 60;
StrPos:=Format('%2.2d:%2.2d:%2.2d', [H, M, S]);
IntPos:=Value;
Result:=True;
end;
procedure SetAudioPos(IntPos: Int64);
var
CurrPos: Int64;
begin
if MediaSeeking=nil then
Exit;
procedure TForm1.Button3Click(Sender: TObject);//стоп воспроизведения
var
Str: string;
Int: integer;
begin
AudioStop(Str, Int);
Label1.Caption:=Str; //вот здесь обнуляется общее время
Label2.Caption:=Str;
SendMessage(TrackBar1.Handle, WM_USER+5, 1, Int);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
Str: string;
Int: integer;
begin
if GetAudioPos(Str, Int) then
begin
Label2.Caption:=Str;
SendMessage(TrackBar1.Handle, WM_USER+5, 1, Int);
end;
SetAudioEvent;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
var
Str: string;
Int: integer;
begin
SetAudioPos(TrackBar1.Position);
if GetAudioPos(Str, Int) then
begin
Label2.Caption:=Str;
SendMessage(TrackBar1.Handle, WM_USER+5, 1, Int);
end;
end;
С одной заморочкой справились - не проверил //изначально Timer1.Enabled = False, а было пусто. Изменил, пример компилируется и файл открывается. Спасибо. Кнопки работают, индикаторы общего времени воспроизведения и текущего показывают соответствующие значения, но с изменением позиции воспроизведения возникли осложнения. Нажав "Паузу" и передвинув движок на нужную позиции времени, продолжить воспроизведение можно, а при следующей "пауэе" регулировку можно произвести только до первого значения остановки а после неё движок не перемещается. При нажатии "Стоп" движок как положено смещается влево до конца, а показатель общего времени не сбрасывается. Как это поправить - не знаю. Без решения этих заморочек нет смысла включать зтот плеер в проект. Надееюсь на вразумления.
Какие изменения надо внести в код, чтобы вместо озвучивания запуска открывался нужный мне файл звукового воспроизведения?
В посте 29-08-2009 15:45, я рекомендовал вместо этого:
//открытие файла
procedure TForm1.Button1Click(Sender: TObject);
var
Str: string;
Int: integer;
begin
AudioRun(Edit1.Text, 0{Panel1.Handle}); //если вы захотите вопроизвести видео -
//вместо 0 укажите хэндл поверхности (например панели), куда будет выводиться
//картинка
Добавить процедуру PlayButton(PathMusic: string), где в параметре PathMusic указывать путь к файлу.
Проверил всё Object TreeView, Object Inspector, Events -всё на месте, а результат тот же, что в моём сообщении от 09-09-2009. В исходном примере файл запуска Windows XP открывается, воспроизводится и все компоненты примера работают. Какие изменения надо внести в код:
//открытие файла
procedure TForm1.Button1Click(Sender: TObject);
var
Str: string;
Int: integer;
begin
AudioRun(Edit1.Text, 0{Panel1.Handle}); //если вы захотите вопроизвести видео -
//вместо 0 укажите хэндл поверхности (например панели), куда будет выводиться
//картинка
чтобы вместо озвучивания запуска открывался нужный мне файл звукового воспроизведения? Пробовал разные варианты указывать путь для компонента Edit1 в Object Inspector'e в строке Text и глухота, а C:\WINDOWS\Media\WindowsXP - запуск.wav - работает. Вот это именно мне не ясно, потому и вопрошаю.
кроме сообщения Undeclared identifier 'Timer1' ничего не получил
Скорее всего, вы не положили на форму компонент TTimer.
хотя procedure Timer1Timer(Sender:TObject); в разделе type не трогал. procedure Timer1Timer - без компонента TTimer, это всего лишь обычная процедура, в имя которой входит строка Timer1, она никогда не будет выполнятся.
С TTimer - это будет уже не просто процедура, а обработчик событий (OnTimer), выполняющийся каждый раз через определённый промежуток времени (Timer1.Interval).
Нет ли ещё каких-нибудь головоломок на эту тему?
Вам надо взять компонент TTimer (на вкладке System) и бросить на форму, потом выделить его и в Object Inspector'e (если не понятно, это окно (снизу, слева) со свойствами компонента) перейти на вкладку Events и выбрать в OnTimer'е строчку Timer1Timer.
Добавил первую часть кода и убрал лишнее - компилируется, но звуковой файл не открывается. Добавил вторую часть кода для удобства - кроме сообщения Undeclared identifier 'Timer1' ничего не получил, хотя procedure Timer1Timer(Sender:TObject); в разделе type не трогал. И ещё - попробовал сделать форму с использованием компонента WindowsMediaPlayer - работает, правда не совсем стабильно - при переходе на другую главу возникают искажения на картинке плеера, но текст в разделе формы RichEdit1 не прокручивается, хотя в коде сохранил всё из работающего проекта. Нет ли ещё каких-нибудь головоломок на эту тему?
31-08-2009 21:01 | Комментарий к предыдущим ответам
PlayButton(PathMusic: string); декларирована явно не здесь.
Ничего страшного :) Добавьте строчку procedure PlayButton(PathMusic: string);
к остальным декларированым процедурам.
Спасибо, посмотрел. От того, что Вы рекомендовали раньше он отличается
добавленными в type XPManifest1:TManifest; и Edit1:TEdit: и, соответственно, в "открытие файла"
begin
AudioRun(Edit1.Text. 0... вместо AudiRun('путь к файлу' 0..., куда я и вставил путь к папке где сидят звуковые файлы проекта (Zvuk\*.wav), корорые не открываются после компиляции проекта, также как и в этом готовом проекте - изменение пути в строке Edi1 воспроизводит только тишину, а указанный C:\WINDOWS\Media\WindowsXP-запуск.wav озвучивает загрузку ХР. Чтобы не создавалось впечатление что я что-то намешал - поясняю. Мой готовый проект открывает главную форму, где я выбираю нужную главу (из 12) щелкаю по ней и открывается форма, на которой в верхней части расположены кнопки для открытия текста этой главы в RichEdit1 (расположен ниже шапки формы) и кнопка для установки плеера AIMP2, посредством которого воспроизвожу звуковое сопровождение текста, выбрав нужную из папки Zvuk. Кнопкой возврат в оглавление - открываю главную форму для последующей работы. Хотелось бы исключить процесс установки плеера и его ручное позиционирование на вставленный в модуль формы этот пример. Все функции примера меня устраивают, осталось только соэдать условия выбора открытия требуемого файла озвучивания текста из папки Zvuk и его закрытие при переходе к другому. Извиняюсь,но короче не смог.Как эту функцию повесить на button2 не знаю. Вот тут нужна помощь.
Позор на мою старую голову. В этой LOGO для взрослых нельзя ошибаться не только в кубике, но и в буквери. Исправил, комплимируется, но звуковые файлы не открываются. Существующий код:
//открытие файла
procedure TForm3.Button2Click(Sender: TObject);
var
Str: string;
Int: integer;
begin
AudioRun('Zvuk\*.wav', 0{Panel1.Handle}); //если вы захотите вопроизвести
//видео - вместо 0 укажите хэндл поверхности (например панели), куда будет
//выводиться картинка
GetAudioCount(Str, Int);
Label1.Caption:=Str;
TrackBar1.Max:=Int;
end;
//пауза - старт
procedure TForm3.Button4Click(Sender: TObject);
begin
AudioStartPause;
end;
Звуковые файлы у меня в папке Zvuk в корне программы, текстовые в папке GLVZ и они открываются:
rocedure TForm3.Button3Click(Sender: TObject);
var
Otkr:TFileStream;
begin
if OpenDialog1.Execute
then
Otkr:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
RichEdit1.Lines.LoadFromStream(Otkr);
FreeAndNil(Otkr);
RichEdit1.ReadOnly:=true;
end;
Возможно в код звукового файла надо добавить OpenDialog2, но соображу куда и в каком виде?
Нашел то,что когда-то удалил в коде и вставил. Без него компилировалось, но плеер не работал, а с ним ошибка:
[Error] Unit3.pas(82): Undeclared identifier: 'CLSTX_INPROC_SERVER'
[Error] Unit3.pas(275): Identifier redeclared: 'TForm3.TrackBar1Change'
[Error] Unit3.pas(276): Identifier redeclared: 'Str'
[Error] Unit3.pas(277): Identifier redeclared: 'Int'
[Error] Unit3.pas(282): Undeclared identifier: 'Lable2'
[Fatal Error] Project1.dpr(9): Could not compile used unit 'Unit3.pas'
в коде
begin
if GraphBuilder<>nil then
Exit;
CoCreateInstance(CLSID_FilterGraph, nil, CLSTX_INPROC_SERVER, IID_IGraphBuilder,
GraphBuilder);
try
if not Assigned(GraphBuilder) then
Exit;
GraphBuilder.RenderFile(PWideChar(WideString(Path)), nil);
if GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl)<>S_OK then
Exit;
курсор останавливается после _SERVER а где объявлять этот идентификатор не знаю и, тем более, что это такое? Может быть у Вас возникнут какие-нибудь соображение, если загляните в рекомендованный код примера? Или где про это почитать?
Добрый день! Устанавливал JVCL так: в C:\Program Files\Borland\delphi7 создал папку JVCL и туда инсталировал сначала vcl затем jvcl командой install в папке с сайта. При работе над проектом добавил пути в Tools\Invironment Options\Library из C:\Program Files\Dorland\Delphi7\JVCL\jcl\lib\d7, затем ...\JVCL\jvcl\dcu, и ...\JVCL\jvcl\lib\d7\debug.
Наконец проект с примером плеера из DirectShow9 скомпилировался, но звуковое сопровождение текста не подключается. Что-то напортачил в коде. Буду сверять с оригиналом.
По поводу TJvRichEdit - у меня 12 глав только чистого текста и в одном предисловии есть картини, которые открылись. Если придется работать с таблицами, учту Ваше замечание. Пока не буду переустанавливать Delphi. Вожно будут вопросы по Вашему примеру плеера, я кажется что-то случайно удалил из кода.
File not found xxx.dcu, хотя путь в Inviornment Options\Library указан четко
А как у вас указан путь: $(DELPHI)\Components\... ?
или C:\Program Files\Borland\Delphi7\Components\... ?
При первом варианте, у меня когда то возникала проблема, точно не помню, вроде модуль искался не по нужному пути.
По поводу .rtf: к сведению, TJvRichEdit не корректно отображает таблицы в документе, не так давно я столкнулся с этой проблемой (проектировал элект. учебники), решил таким таким образом: сохранил документы в формате .mht и открывал их в TWebBrowser'е.
Решив одну задачку, похоже наткнулся на более серьезные проблемы. Надеюсь Вы в курсе дискусии по вопросам Win32.Includ.A (красное сообщение в начале сайта)? Через два дня после инстоляции JVCL у меня началась чехорда при компиляции проектов - возможно это простое совпадение. Сообщил об этом в дискусии и устранил SysConst.bak, но там ребята заняты более серьезными делами - откуда вирус взался, зачем, почему, когда, кому это выгодно и извечный русский вопрос вопрос - что делать? и выпендриваются друг перед другом - у кого лучшая версия и кто лучше понимает эту проблему и чем она грозит. А у меня при компиляции проекта с добавленным модулем MediaPlayer'а (по совету одного из рыцарей на осове DirectShow9) каждый раз сообщает ошибку - File not found xxx.dcu, хотя путь в Inviornment Options\Library указан четко где они находятся, и приходится копировать их в ручную в проект. Надоело когда наткнулся на очередной с Snmp.dcu, которого не нашел. Как Вы думаете, может перустановить мою Delphi7 , или отформатировать весь диск и заново все преустановить, хотя делал это в мае с.г. когда переустанавливал материнскую плату в новый корпус и заменил кое-какое оборудование? Хотелось бы узнать Ваше мнение.
Благодарен за отличную подсказку. Компонент TJvRichEdit запросто открыл мои картинки в текстовом файле rtf, хотя были тпудности с инстоляцией JVCL. В Яндексе мало конкретных ссылок на эту тему, а я не сторонник того, чтобы другие набивали себе шишки роясь в темных закоулках. Таким новичкам как я (а может и не только новичкам), при рекомендациях использования JVCL, можно кое-что конкретизировать. Если этот сыр бесплатный и без мышеловки, то желательно познакомиться с описанием библиотек JCL и JVCL -http://www.tdelphiblog/com/2008/12/jcjedi-code-library-jvcljedi-visual_28.html, где их скачать -http://sourceforge,net/projects/jvcl/files/ я лично взял JVCL337CompleteJCL1105-build3400.zip, трудности при инстоляции -http://forum.source.ru/index.php?showtopic=146237 как их избежать и куда устанавливать, а также указать путь использования этих библиотек в самой среде Delphi через Tools\Invironment Options\Library.
Есть еще вопросы и если можно задам их после того как покопаюсь. Кстати, запуская проект с компонентом WebBrouser в WinXP SP3 все ОК, а в Vista - ПК зависает при открытии этого файла. Меня это не волнует, я от этого ушел.
Если нет острой нужды показывать именно doc/docx файлы, то перевод в rtf очень подходящее решение. К сожалению, стандартный дельфёвый RichEdit не всегда корректно работает с картинками и таблицами.
Очень рекомендую инсталлировать в вашу дельфи библиотеку компонентов JVCL. Библиотека обширная, бесплатная, в ней очень много полезных компонентов. Тамошний TvRichEdit вполне справляется с rtf-файлами с картинками и таблицами.
Так же для отображения файлов Word/Excel и многого другого (при условии что соответсвующие приложения установлены на целевой машине)
можно использовать OleContainer. Но это будет уже тяжелая артиллерия, и если вам нужен всего лишь просмотр документов, лучше использовать компоненты для отображения офисных файлов.
Пару замечаний к вашему коду. RichEdit прекрасно умеет читать файлы сам, напрямую, без промежуточного TFileStream. И свойство ReadOnly можно выставлять в дизайн-тайм, чтоб было меньше кода.
Думал, что вопрос можно задавать по теме для большей ясности, оказалось, что дучше по штукам. Исправлюсь. Для доступа к текстовым файлам *.docx (у меня их 12 и они объемные до 60 КБ) конвертировал их в формат *.rtf (> 500 КБ) и использовал компонент RichEdit:
procedure TForm3.Button3Click(Sender: TObject);
var
Otkr:TFileStream;
begin
if OpenDialog1.Execute
then
Otkr:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
RichEdit1.Lines.LoadFromStream(Otkr);
FreeAndNil(Otkr);
RichEdit1.ReadOnly:=true; //чтобы не было соблазна редактировать
но он не открывает картинки, если они есть в тексте (оставляет на их месте пробел). Еще в одном файле в составе текста необходимо отображать картинки, поэтому использовал компонент WebBrowser без конвертирования исходного файла, так как другого ничего не нашел, по этому и возникли вопросы. Если есть другие варианты, буду рад их проверить.
Хотелось бы узнать почему.
Ну, может, потому что их сразу несколько, и неясно на какой вы ждете ответа :)
Про проблему "неверно указана еденица измерения" в Internet Explorer (и соответственно в построенных на его базе компонентах) много чего может рассказать Яндекс.
После нажатия ОК файл открывается нормально и с ним можно делать все, что хочешь, хотя мне нужно чтобы он только читался.
А что вы пробовали делать, чтоб файл только читался?
Может, для доступа к файлам МС Офиса попробуете использовать более подходящие компоненты чем WebBrowser?
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.