First, you *can* use Journal if you want. If you make a Journal line with a number but without any text whatsoever, it will leave no trace in the actual journal and won't display a message when issued (at least, if you do it from Dialogue; if you use Journal from a regular script, the message is always shown).
Other than that, if you *really* don't want to use Journal, you can use a local variable. The NPC must have a script attached and there must be a line like this:
short KeyGiven
Now, make three lines of dialogue:
NPC == YourNPCDisposition == 70Local KeyGiven == 0Text: Here is the key, %PCNameAction: Set KeyGiven to 1Player->Additem "YourKey" 1
,
NPC == YourNPCLocal KeyGiven == 0Text: I won't give it to you.
and
NPC == YourNPCLocal KeyGiven == 1Text: I already gave it to you.
The line *with* Disposition condition should be above the one *without* it and not vice versa. The variable prevents the NPC from giving you keys again and again every time you click the topic.