Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [DELPHI] Sintax highlighting

    Cari ragazzi, vi pongo un quesito che da tanto tempo mi assilla.
    Vorrei realizzare un servizio di Sintax Highlight per la mia applicazione usando un TRichText.
    Ho provato a risolvere così:
    avendo un array con le parole da grassettare, io cerco nel richtext lettera x lettera ognuna delle parole dell'array e se corrisponde, seleziono e applico l'attributo red.
    Però innanzitutto le varie selezioni si vedono a video e tutto ciò è squallido... Secondopoi quando si arriva a 15-20 righe di testo, la ricerca impiega notevole tempo.... come fanno gli ide con il sintax highlighting? che tecnica usano?

    Proponetemi soluzioni per favore

  2. #2
    up

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Esiste già un componente che fa esattmente ciò che chiedi: SynEdit!

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    si già lo conoscevo. ma volevo capire come si fa a farlo! ho letto i sorgenti ma non ho capito dove stà il trucco.

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da gygabyte017
    si già lo conoscevo. ma volevo capire come si fa a farlo! ho letto i sorgenti ma non ho capito dove stà il trucco.
    Non credo di poterti fornire informazioni più dettagliate di quelle che puoi trovare all'interno del codice sorgente completo di un componente analogo a quello che vuoi creare.

    Questo è uno spazio alquanto limitato per sostenere un tutorial completo a riguardo; inoltre, si tratta di un argomento alquanto complesso, come avrai avuto modo di constatare.

    Il mio suggerimento è quello di analizzare il sorgente a tua disposizione, discernere le varie parti che lo compongono, verificare quali classi, controlli e funzioni API vengono utilizzate, prendere atto dei commenti se ne esistono, consultare guide in linea, documentazione online e altro ancora per ottenere un quadro il più completo possibile della problematica e della sua implementazione tecnica.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    il problema è che nel synedit ci sono talmente tante features, che è molto difficile da capire SOLO l'highliging! io desideravo solo un hint, per capirne le funzioni di base, niente di più. ma se nessuno lo sa pazienza

  7. #7
    Giusto per la cronaca se qualcuno vuole dedicargli 5 minuti, ho scritto questo:

    codice:
    unit SinRichEdit;
    
    interface
    
    uses
      SysUtils, Classes, Controls, StdCtrls, ComCtrls, Windows, Messages, Dialogs,
      Graphics;
    
    type
      TSinRichEdit = class(TRichEdit)
        procedure Change; override;
      private
        FWords: string;
      protected
        { Protected declarations }
      public
        constructor Create(AOwner: TComponent); override;
      published
        property Word: string read FWords write FWords;
      end;
    
    procedure Register;
    
    implementation
    
    constructor TSinRichEdit.Create(AOwner: TComponent);
    begin
    inherited Create(AOwner);
    end;
    
    procedure TSinRichEdit.Change;
    var i:integer;
        LastSelStart: integer;
    begin
    if Word='' then Exit;
    for i:=1 to Length(Self.Text)-Length(Word)+1 do
      begin
      if Copy(Self.Text,i,Length(Word))=Word then
        begin
        LastSelStart := Self.SelStart;
        Self.SelStart := i-1;
        Self.SelLength := Length(Word);
        Self.SelAttributes.Style := [fsBold];
        Self.SelStart := LastSelStart;
        Self.SelLength := 0;
        Self.SelAttributes.Style := [];
        end
      else
        begin
        //showmessage('-'+Copy(Self.Text,i,Length(Word))+'-');
        end;
      end;
    end;
    
    procedure Register;
    begin
      RegisterComponents('EdoComponents', [TSinRichEdit]);
    end;
    
    end.
    Mettetelo in un package e installatelo. Provate a metterlo su un form di prova e vedrete quali sono i problemi... Proma di usarlo però dovete settare la proprietà "Word" con la parola che volete evidenziare... dopodichè scrivete un breve testo a runtime di 15-20 righe contenente 20-30 volte la parola da evidenziare e vedrete...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.