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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2023, 22:11   #1
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию Помогите с переводом функции с VB на Delphi

Доброго дня !
Интересует адаптация на Delphi данного кода.

Ее параметры: Техт - исходное слово. Результат: слово разделенное знаками переноса.
Спасибо заранее за потраченное время !!

Код:
Option Explicit

Public Function SplitWord(ByVal Text As String) As String
    Dim I As Integer, J As Integer, B As Integer, E As Integer
    Dim Bs As String, Es As String
    Dim S() As String
    'разбиваемое слово должно быть длинее 3 символов
    If Len(Text) > 3 Then
        'Отделяем знаки припенания скобки, кавычки и тд.
        For B = 1 To Len(Text)
            If Asc(Mid(Text, B, 1)) > &HBF Then
                Exit For
            End If
        Next B
        For E = Len(Text) To 1 Step -1
            If Asc(Mid(Text, E, 1)) > &HBF Then
                Exit For
            End If
        Next E
        If E > B Then
            If B > 0 Then
                Bs = Left(Text, B - 1)
            End If
            If E < Len(Text) Then
                Es = Right(Text, Len(Text) - E)
            End If
            Text = Mid(Text, B, E - B + 1)
        End If
        'Снова проверяем длину слова
        If Len(Text) > 3 Then
            'Размечаем гласные буквы
            Text = Replace(Text, "А", "А¤")
            Text = Replace(Text, "а", "а¤")
            Text = Replace(Text, "Е", "Е¤")
            Text = Replace(Text, "е", "е¤")
            Text = Replace(Text, "И", "И¤")
            Text = Replace(Text, "и", "и¤")
            Text = Replace(Text, "О", "О¤")
            Text = Replace(Text, "о", "о¤")
            Text = Replace(Text, "У", "У¤")
            Text = Replace(Text, "у", "у¤")
            Text = Replace(Text, "Ы", "Ы¤")
            Text = Replace(Text, "ы", "ы¤")
            Text = Replace(Text, "Э", "Э¤")
            Text = Replace(Text, "э", "э¤")
            Text = Replace(Text, "Ю", "Ю¤")
            Text = Replace(Text, "ю", "ю¤")
            Text = Replace(Text, "Я", "Я¤")
            Text = Replace(Text, "я", "я¤")
            S = Split(Text, "¤")
            If UBound(S) > 0 Then
                For I = 1 To UBound(S) - 1
                    'Удвоенные согласные, для легкого чтения рекомендуется разбивать
                    For J = 1 To Len(S(I)) - 1
                        If Mid(S(I), J, 1) = Mid(S(I), J + 1, 1) Then
                            S(I) = Replace(S(I), Mid(S(I), J, 1) & Mid(S(I), J + 1, 1), Mid(S(I), J, 1) & "-" & Mid(S(I), J + 1, 1))
                            Exit For
                        End If
                    Next J
                    'Распределяем по слогам
                    If InStr(S(I), "-") = 0 Then
                        J = Int((Len(S(I)) - 1) / 2)
                        S(I) = Left(S(I), J) & "-" & Mid(S(I), J + 1)
                    End If
                Next I
                'Переразбиваем слово с учетом предыдущих правил
                Text = Join(S, "")
                S = Split(Text, "-")
                'Буквы Й, Ы, Ъ, Ь нельзя отделять от предшествующей буквы
                For I = 1 To UBound(S)
                    If InStr("ЙЫЪЬ", UCase(Left(S(I), 1))) > 0 Then
                        S(I - 1) = S(I - 1) & Left(S(I), 1)
                        S(I) = Mid(S(I), 2)
                    End If
                Next I
                'Нельзя оставлять на предыдущей строке или переносить на следующую строку одну букву слова
                If Len(S(0)) < 2 Then
                    S(0) = S(0) & S(1)
                    S(1) = ""
                End If
                If Len(S(UBound(S))) < 2 Then
                    S(UBound(S) - 1) = S(UBound(S) - 1) & S(UBound(S))
                    S(UBound(S)) = ""
                    ReDim Preserve S(UBound(S) - 1)
                End If
                'Собираем слово
                Text = Join(S, "-")
                'Делаем чистку
                Text = Replace(Text, "--", "-")
            End If
        End If
        'Возращаем знаки припенания и скобки
        Text = Bs & Text & Es
    End If
    SplitWord = Text
End Function
З.Ы.
Если ошибся темой - не судите строго.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 16.12.2023, 22:32   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Да запросто!
Код:
Function SplitWord(Text:string): string ;
var
    I,J, B, E: integer;
    Bs,Es,S: string;
//    разбиваемое слово должно быть длинее 3 символов
begin
    if Length(Text) > 3 then
//      Отделяем знаки припенания скобки, кавычки и тд.
        for B := 1 to Len(Text) ......
//Ну так и далее - дальше сам.
  
end;
Ну это - начало. Дальше мне лень.
Цитата:
припенания
- это правильно? Может, "припевания" или "припекания" ?

Последний раз редактировалось digitalis; 16.12.2023 в 22:43.
digitalis на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с переводом кода. incl_02 Помощь студентам 3 02.03.2020 09:00
Помогите с переводом куска кода на Delphi в C++ Builder alexey6522 C++ Builder 9 17.09.2014 00:25
Помогите с переводом с++ на с# ka11n C# (си шарп) 5 15.08.2014 08:11
Помогите с переводом! Nattallia Свободное общение 1 20.09.2009 18:24
Помогите пожалуйста с переводом Delphi на C++ Jupiter Помощь студентам 0 07.07.2009 23:33