Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2013, 01:31   #1
belkeandrey
Пользователь
 
Регистрация: 21.02.2013
Сообщений: 48
По умолчанию Открытие jpg из txt и взрыв мозга

Добрый вечер, вернее ночь)) Не знаю как это назвать, но, будучи новичком наверное назову мистикой. Я делаю полноценные ссылки в richedit и уже был на финишной прямой, пока не обнаружил это. Поясню смысл моей разработки: есть текст в rtf формате, который надо показать на форме, при этом при нажатии на ссылку, коих много, должно открыться фото или видео. есть 2 файла txt: один с выписанными из текста ссылками, второй с путями к фото или видео для этих ссылок. При ДВУХ файлах txt все работает замечательно.

НО! Я захотео объединить 2 файла в 1 для удобства, примерно такого вида:

"Модуль рабочего места наводчика=photo/1.jpg
модуль ТСБ - 5=photo/2.jpg
модуля ТСБ-5=photo/3.jpg
сварная кабина=photo/4.jpg
дверью=photo/5.jpg "

Вывожу ТЕ ЖЕ САМЫЕ ЗНАЧЕНИЯ, ТОЛЬКО ДРУГИМ СПОСОБОМ, и картинки то открывает, то пишет ошибку EInvalidGraphics ('.jpg').

Вот код:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls,jpeg;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Label1: TLabel;
    RichEdit1: TRichEdit;
    Memo2: TMemo;
    Image1: TImage;
    Button2: TButton;
    procedure RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
      function RECharIndexByPos(RichEdit: TRichEdit; X,  Y: Integer): Integer;
//    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure RichEdit1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

    
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  SSS, SSS1: tstringlist;
  I:integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  I,J : Integer;
  s: string;
begin
 richedit1.Lines.LoadFromFile('123.rtf');
end;

//Функция определяющая абсолютное положение курсора в тексте
function TForm1.RECharIndexByPos(RichEdit: TRichEdit; X,
  Y: Integer): Integer;
var
  P: TPoint;
begin
  P := Point(X, Y);
  Result := SendMessage(RichEdit.Handle, EM_CHARFROMPOS, 0, longint(@P));
end;

////перемещение мыши
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);

var
  i1,t,kol,kol1:Integer;

 begin

 I1:=RECharIndexByPos(RichEdit1,X,Y);//Положение курсора
 RichEdit1.Cursor:=crArrow;

 SSS := TStringList.Create;
   SSS.LoadFromFile('modulnav.txt');//открываем текст нового вида
  for I := 0 to SSS.Count - 1 do
  begin
    Memo1.Lines.Add(SSS[i]);//выводим для наглядности

  if Pos(SSS.Names[i],RichEdit1.Text)<>0 then
 if (I1>Pos(SSS.Names[i],RichEdit1.Text)-1)and (I1<Pos(SSS.Names[i],RichEdit1.Text)+(Length(SSS.Names[i])-1))then
 begin
 RichEdit1.Cursor:=crHandPoint;
 end;
 end;
 end;

/////щелчок мыши
procedure TForm1.RichEdit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  SSS1:Tstringlist;
  I1,j,I:integer;
  s:string;
 begin
 I1:=RECharIndexByPos(RichEdit1,X,Y);//Положение курсора
 RichEdit1.Cursor:=crArrow;

  for i := 0 to SSS.Count - 1 do
  begin
    Memo2.Lines.Add(SSS.ValueFromIndex[i]); //для наглядности (ВСЕ АБСОЛЮТНО ТО ЖЕ)


 if Pos(SSS.Names[i],RichEdit1.Text)<>0 then
 if (I1>Pos(SSS.Names[i],RichEdit1.Text)-1)and (I1<Pos(SSS.Names[i],RichEdit1.Text)+(Length(SSS.Names[i])-1))then
 begin

 s:=SSS.ValueFromIndex[i]; //записываем в s
 image1.Picture.LoadFromFile(s); //!!!!!!!!!!!!!!!!!!!!!!!!!тут ошибка
 label1.Caption:=s; //тут все 1 в 1 с предыдущим кодом
 end;
 end;
 end;

end.
Ребят, помогите!!!! Просто получается абсурдно.... Оба проекта во вложении


_________
Код нужно оформлять по правилам:
тегом [CODE]..[ /CODE] ( тега [DELPHI] на форуме, к сожалению, нет! )
(кнопочка на панели форматирования с решёточкой #)

Не забывайте об этом!

Модератор.
Вложения
Тип файла: rar 2 проекта.rar (1.74 Мб, 9 просмотров)

Последний раз редактировалось Serge_Bliznykov; 19.03.2013 в 09:10.
belkeandrey вне форума Ответить с цитированием
Старый 19.03.2013, 08:29   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

1. Код нужно оформлять соответствующими тегами. (тег должен быть CODE, а не DELPHI)
2. Прежде, чем открывать файл, выведите куда-нибудь его имя. Просто, чтобы быть уверенным, что Вы его правильно выделили.
3. И, кстати, из-за 1, я не нашел, где Вы выделяете из строки имя файла.
s-andriano вне форума Ответить с цитированием
Старый 19.03.2013, 10:23   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

в файле modulnav.txt после имени файла попадаются 1 или 2 лишних пробела.
Блин. Сам не сразу понял. Минут 10 как баран на новые ворота смотрел
Увидел, когда для вывода имени файла использовал эдит вместо лэйбла, скопировал его в командную строку, а он и вправду не открывается lol

Последний раз редактировалось Sibedir; 19.03.2013 в 10:26.
Sibedir вне форума Ответить с цитированием
Старый 19.03.2013, 15:07   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вот-вот.
При разборе текстовых файлов я обычно пишу в отдельный лог-фай протокол работы. При этом выделенные текстовые строки обязательно помещаю в какие-то видимые ограничители (обычно угловые, фигурные или квадратные скобки - в зависимости от контекста) - специально, чтобы видны были как лишние пробелы, так и пустые поля.
s-andriano вне форума Ответить с цитированием
Старый 20.03.2013, 00:11   #5
belkeandrey
Пользователь
 
Регистрация: 21.02.2013
Сообщений: 48
По умолчанию

Ребят, спасибо большое! Тоже отыскал) Насчет кода извиняюсь, не мог найти. Но вот блин другая проблемка: в большом тесте и с большим кол-вом ссылок (150 штук), все тормозит, т.к. большие циклы всегда считает. Что делать? Скоро работу сдавать(((
belkeandrey вне форума Ответить с цитированием
Старый 20.03.2013, 06:16   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Не удивительнро
1. Вы при каждом перемещении мыши делаете
Код:
 SSS := TStringList.Create;
   SSS.LoadFromFile('modulnav.txt');//открываем текст нового вида
А потом его еще и удалять забываете
2. И еще у вас при движениях вывод в memo идет. В окончательном релизе оно не надо будет.
3. Но самое главное, как мне кажется, это неоптимальность работы с RichEdit1.Text. Впринципе, нужен не весь текст, а только окресности курсора.

Давайте попробуем устронить 1 и 2, если не поможет, тогда уже подумаем над 3.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, Jpeg;

type
  TForm1 = class(TForm)
    Memo11: TMemo;
    Button1: TButton;
    RichEdit1: TRichEdit;
    Memo21: TMemo;
    Image1: TImage;
    Button2: TButton;
    Edit11: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure RichEdit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
    function RECharIndexByPos (RichEdit: TRichEdit; X,  Y: Integer): Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  SSS: TStringList;
  CurPhoto: string;

implementation

{$R *.dfm}

//Функция определяющая абсолютное положение курсора в тексте
function TForm1.RECharIndexByPos (RichEdit: TRichEdit; X, Y: Integer): Integer;
var
  P: TPoint;
begin
  P := Point (X, Y);
  Result := SendMessage (RichEdit.Handle, EM_CHARFROMPOS, 0, LongInt(@P));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SSS := TStringList.Create;
  SSS.LoadFromFile('modulnav.txt');
  RichEdit1.Lines.LoadFromFile ('123.rtf');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil (SSS);
end;

////перемещение мыши
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  i, CharIndex: Integer;
  s: string;
begin
  RichEdit1.Cursor := crArrow;
  CharIndex := RECharIndexByPos(RichEdit1,X,Y); //Положение курсора
  CurPhoto := '';
  for i := 0 to SSS.Count - 1 do begin
    s := SSS.Names[i];
    if Pos (s, RichEdit1.Text) <> 0 then
      if (CharIndex > Pos(s,RichEdit1.Text)-1) and
         (CharIndex < Pos(s,RichEdit1.Text)+(Length(s)-1)) then begin
        RichEdit1.Cursor := crHandPoint;
        CurPhoto := ExtractFilePath (Application.ExeName) + SSS.ValueFromIndex[i];
        Exit;
      end;
  end;
end;

/////щелчок мыши
procedure TForm1.RichEdit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if CurPhoto <> '' then Image1.Picture.LoadFromFile (CurPhoto);
end;

end.
Sibedir вне форума Ответить с цитированием
Старый 20.03.2013, 21:13   #7
belkeandrey
Пользователь
 
Регистрация: 21.02.2013
Сообщений: 48
По умолчанию

Sibedir, код значительно уменьшился и оптимизировался. Прога работает более-менее красиво, но вот все-таки курсор моргает при перемещении по ссылке, а в конце текста немного запаздывает появляться.
Я думаю можно попробовать разобраться с richedit, буду очень благодарен!
Еще интересная на первый взгляд ситуация: если ссылки копировать в txt из ворда, то работают в проге не все. Корректная работа только при копировании из самого ричэдита, возможно невидимые пробелы или еще что-то...
Вложения
Тип файла: rar проба2.rar (907.6 Кб, 6 просмотров)
belkeandrey вне форума Ответить с цитированием
Старый 20.03.2013, 21:55   #8
belkeandrey
Пользователь
 
Регистрация: 21.02.2013
Сообщений: 48
По умолчанию

Опять не пойму, с ссылками бред. Какие-то сечетания слов работают, какие-то нет. Приходится каждую ссыль вручную править...
belkeandrey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
взрыв мозга уже..(работа со строкой) spydark91 Общие вопросы Delphi 1 19.10.2011 09:48
открытие txt в Memo НиРа Помощь студентам 8 19.12.2010 14:39
JPG и TXT в одном файле prizrak1390 Общие вопросы Delphi 9 19.04.2009 18:45
Открытие файлов *.txt Bill Gates Общие вопросы Delphi 3 28.11.2007 22:44