Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите переписать c Delphi на с++ 
:(
    Опции темы
vasyabah2014
Дата 27.7.2015, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.7.2015

Репутация: нет
Всего: нет



Код

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
rdReplaceDialog: TReplaceDialog;
moText: TMemo;
procedure FormCreate(Sender: TObject);
procedure rdReplaceDialogFind(Sender: TObject);
procedure rdReplaceDialogReplace(Sender: TObject);
private
{ Private declarations }
FI, FPosReturn:integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
rdReplaceDialog.Execute;
end;
procedure TForm1.rdReplaceDialogFind(Sender: TObject);
var
I, J, PosReturn, SkipChars: integer; S,SerchStr:string;
begin
for I := FI to moText.Lines.Count do
begin
if FPosReturn=0 then S:=moText.Lines[I]  else S:=copy(moText.Lines[I],FPosReturn+1,Length(moText.Lines[I])-FPosReturn+1);
if not(frMatchCase in rdReplaceDialog.Options) then
begin
S:=AnsiUpperCase(S);
SerchStr:=AnsiUpperCase(rdReplaceDialog.FindText);
end else  SerchStr:=rdReplaceDialog.FindText;
if frWholeWord in rdReplaceDialog.Options then
PosReturn := Pos(' '+SerchStr+' ',S)
else
PosReturn := Pos(SerchStr,S);
if PosReturn <> 0 then {found!}
begin
SkipChars := 0;
for J := 0 to I - 1 do
SkipChars := SkipChars + Length(moText.Lines[J]);
SkipChars := SkipChars + (I*2);
SkipChars := SkipChars + PosReturn - 1 + FPosReturn;
FPosReturn:=FPosReturn+PosReturn;
moText.SetFocus;
if frWholeWord in rdReplaceDialog.Options then
moText.SelStart := SkipChars+1
else
moText.SelStart := SkipChars;
moText.SelLength := Length(rdReplaceDialog.FindText);
FI:=I;
Break;
end else FPosReturn:=0;
end;
end;
procedure TForm1.rdReplaceDialogReplace(Sender: TObject);
var
SelPos: integer;
begin
if not(frReplaceAll in rdReplaceDialog.Options) then
begin
SelPos := Pos(rdReplaceDialog.FindText, moText.Lines.Text);
if SelPos > 0 then
begin
moText.SelStart := SelPos - 1;
moText.SelLength := Length(rdReplaceDialog.FindText);
moText.SelText := rdReplaceDialog.ReplaceText;
end
else MessageDlg('Текст "'+rdReplaceDialog.FindText+'" не найден', mtError, [mbOk], 0); 
end else
moText.Lines.Text:=StringReplace(moText.Lines.Text,rdReplaceDialog.FindText,rdReplaceDialog.ReplaceText,[rfReplaceAll]);
end;
end.

PM MAIL   Вверх
_zorn_
Дата 27.7.2015, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Помогите, или все же перепишите за меня ?

Хоть бы словом обмолвился, наглец  smile 
PM MAIL   Вверх
rudolfninja
Дата 27.7.2015, 17:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: нет
Всего: 6



Что вообще должно делать приложение? В конечном итоге важен UI или функциональность?
PM MAIL Skype   Вверх
vasyabah2014
Дата 27.7.2015, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.7.2015

Репутация: нет
Всего: нет



Цитата(_zorn_ @ 27.7.2015,  17:26)
Помогите, или все же перепишите за меня ?

Хоть бы словом обмолвился, наглец  smile

Просто я его конвертером преобразовал не работает
Код

#ifndef Unit1H
#define Unit1H


#include <System.hpp>

#include <windows.hpp>
#include <messages.hpp>
#include <sysutils.hpp>
#include <variants.hpp>
#include <classes.hpp>
#include <graphics.hpp>
#include <controls.hpp>
#include <forms.hpp>
#include <dialogs.hpp>
#include <stdctrls.hpp>
#include <comctrls.hpp>



class TForm1;




class TForm1: public TForm {
  typedef TForm inherited;
  public:
  TReplaceDialog rdReplaceDialog;
  TMemo moText;
  void __fastcall FormCreate( TObject* Sender );
  void __fastcall rdReplaceDialogFind( TObject* Sender );
  void __fastcall rdReplaceDialogReplace( TObject* Sender );
  private:
    /* Private declarations */
  int FI, FPosReturn;
  public:
    /* Public declarations */
};


extern TForm1* Form1;

#endif //  Unit1H


 
Код


#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"


#pragma resource "*.dfm"


#include <System.hpp>


TForm1* Form1 = NULL;



void __fastcall TForm1::FormCreate( TObject* Sender )
{
  rdReplaceDialog.Execute;
}


void __fastcall TForm1::rdReplaceDialogFind( TObject* Sender )
{
  int I = 0, J = 0, PosReturn = 0, SkipChars = 0;
  String S, SerchStr;
  for ( int stop = moText.Lines.Count, I = FI; I <= stop; I++)
  {
    if ( FPosReturn == 0 )
      S = moText.Lines[I];
    else
      S = Copy( moText.Lines[I], FPosReturn + 1, Length( moText.Lines[I] ) - FPosReturn + 1 );
    if ( ! ( rdReplaceDialog.Options.Contains(frMatchCase ) ) )
    {
      S = AnsiUpperCase( S );
      SerchStr = AnsiUpperCase( rdReplaceDialog.FindText );
    }
    else
      SerchStr = rdReplaceDialog.FindText;
    if ( rdReplaceDialog.Options.Contains(frWholeWord ) )
      PosReturn = S.Pos( String( " " ) + SerchStr + " " );
    else
      PosReturn = S.Pos( SerchStr );
    if ( PosReturn != 0 ) /*found!*/
    {
      SkipChars = 0;
      for ( int stop = I - 1, J = 0; J <= stop; J++)
        SkipChars = SkipChars + Length( moText.Lines[J] );
      SkipChars = SkipChars + ( I * 2 );
      SkipChars = SkipChars + PosReturn - 1 + FPosReturn;
      FPosReturn = FPosReturn + PosReturn;
      moText.SetFocus;
      if ( rdReplaceDialog.Options.Contains(frWholeWord ) )
        moText.SelStart = SkipChars + 1;
      else
        moText.SelStart = SkipChars;
      moText.SelLength = Length( rdReplaceDialog.FindText );
      FI = I;
      Break;
    }
    else
      FPosReturn = 0;
  }
}


void __fastcall TForm1::rdReplaceDialogReplace( TObject* Sender )
{
  int SelPos = 0;
  if ( ! ( rdReplaceDialog.Options.Contains(frReplaceAll ) ) )
  {
    SelPos = Pos( rdReplaceDialog.FindText, moText.Lines.Text );
    if ( SelPos > 0 )
    {
      moText.SelStart = SelPos - 1;
      moText.SelLength = Length( rdReplaceDialog.FindText );
      moText.SelText = rdReplaceDialog.ReplaceText;
    }
    else
      MessageDlg( "Текст \"" + rdReplaceDialog.FindText + "\" не найден", mtError, ARRAYOFCONST(( mbOk )), 0 );
  }
  else
    moText.Lines.Text = StringReplace( moText.Lines.Text, rdReplaceDialog.FindText, rdReplaceDialog.ReplaceText, ARRAYOFCONST(( rfReplaceAll )) );
}



Добавлено через 2 минуты и 1 секунду
Цитата(rudolfninja @ 27.7.2015,  17:34)
Что вообще должно делать приложение? В конечном итоге важен UI или функциональность?

Реализовывать поиск и замену через ReplaceDialog .Нужно только содержимое обработчиков событий
PM MAIL   Вверх
rudolfninja
Дата 28.7.2015, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: нет
Всего: 6



А пробовали найти готовые решения в интернете? Уверен, что там есть много готовых примеров.
Вот, например.
PM MAIL Skype   Вверх
xvr
Дата 28.7.2015, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(vasyabah2014 @  27.7.2015,  17:34 Найти цитируемый пост)
Просто я его конвертером преобразовал не работает

Какой то недоделанный конвертор -
Код

  TReplaceDialog rdReplaceDialog;
  TMemo moText;
эти поля должны стать указателями на TReplaceDialog и TMemo, а не экземплярами. В Delphi и C++ понятие объекта несколько разное - то, что в Delphi является объектом, в С++ является указателем на него  smile 
PM MAIL   Вверх
vasyabah2014
Дата 28.7.2015, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.7.2015

Репутация: нет
Всего: нет



Цитата(xvr @ 28.7.2015,  12:02)
Цитата(vasyabah2014 @  27.7.2015,  17:34 Найти цитируемый пост)
Просто я его конвертером преобразовал не работает

Какой то недоделанный конвертор -
Код

  TReplaceDialog rdReplaceDialog;
  TMemo moText;
эти поля должны стать указателями на TReplaceDialog и TMemo, а не экземплярами. В Delphi и C++ понятие объекта несколько разное - то, что в Delphi является объектом, в С++ является указателем на него  smile

Ругается на функции Copy() и Length() Говорит таких нету в с++,а чем заменить не знаю

Это сообщение отредактировал(а) vasyabah2014 - 28.7.2015, 16:09
PM MAIL   Вверх
vasyabah2014
Дата 28.7.2015, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.7.2015

Репутация: нет
Всего: нет



Цитата(rudolfninja @ 28.7.2015,  12:00)
А пробовали найти готовые решения в интернете? Уверен, что там есть много готовых примеров.
Вот, например.

Мне нужно без функции FindText. RXRichEdit её плохо поддерживает
PM MAIL   Вверх
rudolfninja
Дата 28.7.2015, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: нет
Всего: 6



Прочитайте про класс TAnsiString - станет проще. Там Length и метод, аналогичный Copy() - это методы класса.
PM MAIL Skype   Вверх
vasyabah2014
Дата 28.7.2015, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.7.2015

Репутация: нет
Всего: нет



Цитата(rudolfninja @ 28.7.2015,  16:38)
Прочитайте про класс TAnsiString - станет проще. Там Length и метод, аналогичный Copy() - это методы класса.

Я пробовал с этим методом возникает исключение Access Viocation при втором поиске.Или если текст не найден
PM MAIL   Вверх
rudolfninja
Дата 28.7.2015, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: нет
Всего: 6



Access Viocation валится из-за того, что вы, видимо, пытаетесь вылезти за пределы какого-то куска памяти, в котором должна храниться строка или строки вовсе нет.

PM MAIL Skype   Вверх
vasyabah2014
Дата 28.7.2015, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.7.2015

Репутация: нет
Всего: нет



Цитата(rudolfninja @ 28.7.2015,  16:49)
Access Viocation валится из-за того, что вы, видимо, пытаетесь вылезти за пределы какого-то куска памяти, в котором должна храниться строка или строки вовсе нет.

Я писал так как мне конвертер  с паскаля преобразовал.Там работает.А на СИ нет.С дельфи преобразовывал программой Delphi2CPP

Это сообщение отредактировал(а) vasyabah2014 - 28.7.2015, 16:56
PM MAIL   Вверх
rudolfninja
Дата 28.7.2015, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: нет
Всего: 6



В общем, вместо Copy используется метод строкового класса SubStr, вместо Length - одноименный метод строковго класса. 
PM MAIL Skype   Вверх
vasyabah2014
Дата 28.7.2015, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.7.2015

Репутация: нет
Всего: нет



Цитата(rudolfninja @ 28.7.2015,  17:05)
В общем, вместо Copy используется метод строкового класса SubStr, вместо Length - одноименный метод строковго класса.

Мне конвертер выдал  S = Copy( moText.Lines[I], FPosReturn + 1, Length( moText.Lines[I] ) - FPosReturn + 1 );
 как написать Substr вместо Copy?там порядок аргументов такой же?и типы такие же
PM MAIL   Вверх
vasyabah2014
Дата 29.7.2015, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.7.2015

Репутация: нет
Всего: нет



Цитата(rudolfninja @ 28.7.2015,  17:05)
В общем, вместо Copy используется метод строкового класса SubStr, вместо Length - одноименный метод строковго класса.

Всё я решил свою проблему.У RXRichEdit оказались методы RxRichEdit->FindDialog RxRichEdit->ReplaceDialog и RxRichEdit->FindNext.Они дают полностью функциональный   поиск и замену.Вот как!smile  smile  smile


Это сообщение отредактировал(а) vasyabah2014 - 2.8.2015, 14:54
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1026 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.