Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Помогите переписать c Delphi на с++


Автор: vasyabah2014 27.7.2015, 16:20
Код

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.

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

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

Автор: rudolfninja 27.7.2015, 17:34
Что вообще должно делать приложение? В конечном итоге важен UI или функциональность?

Автор: vasyabah2014 27.7.2015, 17:34
Цитата(_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 .Нужно только содержимое обработчиков событий

Автор: rudolfninja 28.7.2015, 12:00
А пробовали найти готовые решения в интернете? Уверен, что там есть много готовых примеров.
http://bcbjournal.org/articles/vol1/9710/Using_the_Find_and_Replace_dialog_boxes.htm, например.

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

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

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

Автор: vasyabah2014 28.7.2015, 16:08
Цитата(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:37
Цитата(rudolfninja @ 28.7.2015,  12:00)
А пробовали найти готовые решения в интернете? Уверен, что там есть много готовых примеров.
http://bcbjournal.org/articles/vol1/9710/Using_the_Find_and_Replace_dialog_boxes.htm, например.

Мне нужно без функции FindText. RXRichEdit её плохо поддерживает

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

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

Я пробовал с этим методом возникает исключение Access Viocation при втором поиске.Или если текст не найден

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

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

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

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

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

Мне конвертер выдал  S = Copy( moText.Lines[I], FPosReturn + 1, Length( moText.Lines[I] ) - FPosReturn + 1 );
 как написать Substr вместо Copy?там порядок аргументов такой же?и типы такие же

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)